c-内存碎片



当我随机使用malloc()s和free()s时,嵌套并且大小不同,在某个时候内存会被分割,因为这些操作留下了一大串不连续的小内存区域,因此无法作为一个更大的部分分配。

关于这个的几个问题:

  • 当这种情况经常发生,导致内存被分割,然后所有这些内存区域都是free()d时,我能假设这些空闲区域被连接回其原始的连续大小吗?

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

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

对的连续调用所分配的存储的顺序和邻接性aligned_alloc、calloc、malloc和realloc函数是未指明。

无论如何,你有两个选择:

  1. 完全信任库内存管理功能
  2. 如果你真的很自信,就编写自己的内存管理器

如果我是你,我肯定会信任现有的功能,因为现代实现是超级智能的。

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

对的连续调用所分配的存储的顺序和邻接性aligned_alloc、calloc、malloc和realloc函数是未指明。

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

如果你依赖内置内存管理,你能做什么

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

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

  3. 使用智能指针。

注意:

  1. 内部碎片。

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

  3. Valgrind仪器框架。

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

最新更新