内存碎片

Memory fragmentation

当我随机使用 malloc()s 和 free()s 时,嵌套且大小不同,在某些时候内存会碎片化,因为这些操作会留下一大堆小内存区域是不连续的,因此不能分配为一个更大的部分。

关于这个的几个问题:

不,无法保证。根据 N1570,7.22.3 Memory management functions:

The order and contiguity of storage allocated by successive calls to the aligned_alloc, calloc, malloc, and realloc functions is unspecified.

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

  1. 完全信任库内存管理功能。
  2. 如果您真的有信心,请编写您自己的内存管理器。

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

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

The order and contiguity of storage allocated by successive calls to the aligned_alloc, calloc, malloc, and realloc functions is unspecified.

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

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

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

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

  3. 使用智能指针。

备注:

  1. Internal fragmentation.

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

  3. Valgrind 仪表框架。

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