内存碎片

Elm*_*lmi 11 c memory malloc memory-fragmentation

当我随机地使用malloc()s和free()s,嵌套并且具有不同的大小时,在某些时候内存将被分段,因为这些操作留下了大量的小内存区域,后面是非连续的,因此不能被分配为一个更大的块.

关于这个的一些问题:

  • 如果经常这样做,以便内存被强制分段,然后所有这些内存区域都是free()d,我可以假设这些空闲区域连接回原来的连续大小吗?

  • 当我总是执行a malloc()后跟free()相同的内存并且从不嵌套这些调用时,在分配/释放的大小总是不同的情况下,内存是否也在这种情况下碎片化?

nal*_*zok 5

不,没有保证.根据N1570,7.22.3内存管理功能:

通过连续调用aligned_alloc,calloc,malloc和realloc函数分配的存储的顺序和连续性未指定.

无论如何,您有两种选择:

  1. 完全信任库内存管理功能.
  2. 如果你真的很自信,请写下你自己的记忆管理员.

如果我是你,我肯定会相信现有的功能,因为现代的实现非常聪明.


sjs*_*sam 4

根据ISO/IEC 9899:201x -> 7.22.3

通过连续调用aligned_alloc、calloc、malloc 和realloc 函数分配的存储的顺序和连续性未指定。

一个好的内存管理器将能够在一定程度上解决这个问题。然而,还有其他方面,例如数据对齐[1],会导致内部碎片。

如果您依赖内置内存管理,您可以做什么?

  1. 使用带有内存检查选项的探查器(例如 valgrind)来查找使用后未释放的内存。例子:

     valgrind --leak-check=yes myprog arg1 arg2
    
    Run Code Online (Sandbox Code Playgroud)
  2. 遵循良好做法。示例 - 在 C++ 中,如果您希望其他人从您的多态类继承,您可以将其析构函数声明为 virtual。

  3. 使用智能指针。

笔记:

  1. 内部碎片化

  2. 如果您要使用自己的内存管理系统,您可以考虑Boehm-Demers-Weiser垃圾收集器。

  3. Valgrind仪器框架。

  4. 使用后未释放的内存将导致碎片。