在C ++中对动态分配的内存进行碎片整理

时间:2013-06-09 11:05:11

标签: c++ memory-management

动态分配的内存(使用new和malloc运算符分配)的碎片整理如何在C ++中运行?

2 个答案:

答案 0 :(得分:4)

C ++堆中没有碎片整理,因为应用程序可以随意保留指向已分配内存的指针。因此,堆管理器无法移动已分配的内存。唯一可能的“碎片整理”是你释放两个相邻的块。然后堆管理器将这两个块组合成一个更大的空闲块,可以再次用于分配。

答案 1 :(得分:2)

您可能想要查看slab分配器。这不是你的银弹,但对于特定的问题,你可以减轻压力。在我过去的一个项目中,我们已经编写了自己的分配器,这是一个非常复杂的事情,但它确实设法控制了这个问题。

虽然我一般同意其他答案,但有时特定用例会有希望。例如可以使用池分配器处理的类似对象: http://www.boost.org/doc/libs/1_53_0/libs/pool/doc/index.html

另外一个有趣的读物是带有boost interprocess的分配器:http://www.boost.org/doc/libs/1_53_0/doc/html/interprocess/allocators_containers.html#interprocess.allocators_containers.stl_allocators_adaptive