【发布时间】:2013-05-22 13:50:52
【问题描述】:
有什么:
- 分配/解除分配/重新分配许多可变大小的对象而不会产生碎片(基本上是
malloc所做的)和 - 跟踪用于这些分配的所有内存页面,以便我可以
- 稍后
mprotect将所有这些页面设为只读 - 最好没有任何锁定 - 所有访问都将是单线程的
- 在 Linux 和 OS X 上运行,最好在 Windows 上使用等效的东西?
我想不出用标准内存分配函数来做这件事的方法。想到的唯一策略是使用自定义内存池而不是malloc。所以我的问题是:有没有办法在没有自定义 malloc 或(如果没有)关于使用什么的建议的情况下做到这一点?
我可以包装malloc 并轻松跟踪它使用过的所有页面 我如何保证一旦我在这些页面上调用mprotect malloc 不会尝试使用“捕获”的内存在受影响的页面之一中分配块的开始之前还是结束之后?
【问题讨论】:
-
“稍后”是什么意思?进程终止后?您的真正意思是“页”(虚拟内存)还是“帧”(物理内存)?
-
只需要分配内存吗?或者也解除分配它?你的用例是什么?
-
正常的 malloc 不起作用,例如因为对于小分配,页面在使用 malloc 分配的多个事物之间共享
-
如果您将跟踪数据放在扩展的
malloc()分配中:而是包装malloc()、free()等,而不将您的跟踪信息添加到分配的块中。在那里添加您的跟踪信息,在单独的内存空间中创建一个并行跟踪列表。那么您的mprotect()电话不会影响您的跟踪数据。 -
您是否正在寻找类似 dmalloc 或 Electric Fence malloc 调试器之类的东西?
标签: c memory-management malloc mprotect