malloc和free是如何实现的?

2023-11-25

我想实现我自己的动态内存管理系统,以添加有助于管理 C++ 内存的新功能。

我使用 Windows (XP) 和 Linux (Ubuntu)。 实现“malloc”和“free”等功能需要什么? 我认为我必须使用最低级别的系统调用。

对于 Windows,我找到了以下函数:GetProcessHeap、HeapAlloc、HeapCreate、HeapDestroy 和 HeapFree。

对于Linux,我还没有发现任何用于堆管理的系统调用。在Linux上,malloc和free是系统调用,不是吗?

Thanks

Edit:
C++不提供垃圾收集器,并且垃圾收集器速度很慢。有些分配很容易释放,但有些分配需要垃圾收集器。

我想实现这些功能并添加新功能:
* 每当调用 free() 时,检查指针是否属于堆。
* 帮助垃圾收集。我必须存储一些有关分配块的信息。
* 使用多个堆(Windows 上的 HeapCreate/HeapDestroy)。我可以快速删除整个堆及其分配的块。


在linux上,malloc和free不是系统调用。 malloc/free 通过使用扩展和收缩(如果可以的话)数据段从内核获取内存brk系统调用以及获取匿名内存mmap- malloc 管理这些区域内的内存。一些基本信息可以找到许多很棒的参考资料here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

malloc和free是如何实现的? 的相关文章

  • 无法使用 strptime() 获取秒数

    我收到 YYYY MM DDThh mm ss S Z hh mm 这种格式的日期时间 我正在尝试使用复制该值strptime如下所示 struct tm time 0 char pEnd strptime datetime Y m dT
  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反

随机推荐

  • 函数指针如何工作?

    我正在问一些具体问题 如何在类中初始化它们 如何将函数作为参数传递 类中是否需要声明和定义函数指针 对于问题 2 我的意思是 void s void void f function what should I put as type to
  • 通过 jquery 上下移动选择选项

    所以我让这段代码适用于 Firefox 和 Chrome 它的作用是允许您在 HTML 选择表单中重新排序选项 但是当我通过 IE8 测试代码时 它有点不完整 它仅适用于前几次单击 之后您必须多次单击该按钮才能使其工作 有谁知道任何其他代码
  • 解析 HTML 表格最快、最简单、最好的方法是什么?

    我正在尝试获取这张桌子http www datamystic com timezone time zones html转换为数组格式 这样我就可以用它做任何我想做的事情 最好是 PHP Python 或 JavaScript 这种问题经常出
  • RxJs 可观察分页

    第一 这是我使用 RxJs 的第一个项目 我想通过使用它我会学到最好的东西 我找到了这个答案 使用 RxJs 将分页请求转换为 Observable 流但评论里却说 您仍然超出了最大调用堆栈 返回大约 430 页 我认为递归可能不是最好的解
  • Shift + 鼠标滚轮水平滚动

    对于水平滚动 使用 Shift 滚轮相当常见 这两者都相当容易捕获 我可以使用 MouseWheel 事件以及由 KeyDown KeyUp 事件设置的标志来跟踪何时按下 Shift 键 但是 如何真正触发水平滚动呢 我知道 WM MOUS
  • GHC 7.7 中引入的自由覆盖条件破坏了 GHC 7.6 中有效的代码

    The idea 我正在写一个DSL 编译为 Haskell 该语言的用户可以定义自己的不可变数据结构和关联函数 我所说的关联函数是指属于数据结构的函数 例如 用户可以编写 用 pythonic 伪代码 data Vector a x y
  • 如何使用 gitpython 对当前提交与上次提交进行 git diff?

    我正在尝试掌握 gitpython 模块 hcommit repo head commit tdiff hcommit diff HEAD 1 but tdiff hcommit diff HEAD HEAD 不起作用 也不 HEAD HE
  • 是否可以为 UITableView 添加边框样式? (不是边框颜色/边框宽度)

    是否可以为 UITableView 添加边框样式 不仅仅是边框颜色和边框宽度 例如凹槽边框样式 嘿 您可以使用以下方式为您的视图添加边框CALayer可以在QuartzCore Framework 以下链接将帮助您了解CALayer详细 C
  • 如何使用 Eclipse 将特定于平台的本机库包含在 .JAR 文件中?

    我刚刚开始学习JNI 我一直在遵循一个简单的示例 并且创建了一个调用本机库中的 Hello World 方法的 Java 应用程序 我想以 Win32 和 Linux x86 为目标 我的库驻留在 DLL 中 当 DLL 添加到 Eclip
  • 如何阻止 Eclipse 在每次捕获的异常时崩溃?

    当我开始调试 java 项目时 Eclipse 不断地破坏第 3 方库中的随机异常 这非常烦人 知道如何阻止这个吗 我尝试单击断点视图上的 图标 我可以看到 挂起捕获的异常 和 挂起未捕获的异常 复选框都没有选中 Eclipse 仍然在异常
  • SCSS 与字符串的算术运算

    selector width 10px width width 2 output 10px but expected 5px 上面的代码是不言自明的 请纠正我 您可以使用calc功能 selector width 10px width ca
  • 为什么不能在字节变量中存储负值?

    我正在转换可以在 Java 中运行但不能在 C 中运行的代码 byte buffer new byte 64 this buffer int this count 0x3F 128 这会生成编译时错误 常量值 128 无法转换为 字节 如何
  • 如何在 MySQL 中创建时间点架构

    I read this有关为数据库构建时间点架构的文章 在我看来 这是一个优雅的解决方案 但这篇文章是在不久前 2007 年 就已经准备好的 我想知道 1 还有其他方法可以解决这个问题吗 2 这种方法和其他方法的优缺点是什么 3 是否有可供
  • Burn 中的RegistrySearch 与 util:RegistrySearch

    我在用Burn构建 WiX 引导程序 我意识到如下所示的RegistrySearch实际上并没有搜索注册表 我用了过程监控器监视注册表访问
  • Haskell:类型推断和函数组合

    这个问题的灵感来自于此answer另一个问题 表明您可以使用定义为的函数从列表中删除每个出现的元素 removeall filter 用铅笔和纸根据以下类型进行计算filter and 该函数的类型为 removeall Eq a gt a
  • 将 Ruby 对象序列化为 JSON 并返回?

    我想将一个对象序列化为 JSON 将其写入文件并读回 现在我希望在 net 中有类似的东西 你有 json net 或类似的东西 然后你会这样做 JsonSerializer Serialize obj 并完成它 您将返回 JSON 字符串
  • asp.net mvc 中的动态子域

    我对 ASP NET 相当陌生 对 IIS 也没什么经验 我想让我的应用程序的每个用户都有自己的子域 但都使用相同的控制器 然后子域将控制显示的内容 Example user1subdomain mydomain com Whatever
  • 为什么这样的递归不会出现堆栈溢出?

    我不明白为什么打电话recSetTimeOut 不会导致堆栈溢出错误 而recPromise does const recSetTimeOut gt console log in recSetTimeOut setTimeout recSe
  • 为什么要升级到 c# 4.0?

    我知道 C 4 0 中有一些不错的新功能 但我无论如何也想不出升级现有项目或切换到新项目的令人信服的理由 我看过一些帖子 人们说如果他们的托管服务不提供 Net 4 他们会寻找另一个提供商 因为 Net 4 是他们的方向的核心
  • malloc和free是如何实现的?

    我想实现我自己的动态内存管理系统 以添加有助于管理 C 内存的新功能 我使用 Windows XP 和 Linux Ubuntu 实现 malloc 和 free 等功能需要什么 我认为我必须使用最低级别的系统调用 对于 Windows 我