12

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

关于这个的几个问题:

  • 如果经常这样做以致内存被迫碎片化,然后所有这些内存区域都是free()d,我可以假设这些空闲区域连接回其原始的连续大小吗?

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

4

2 回答 2

5

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

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

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

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

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

于 2016-05-12T12:27:39.757 回答
3

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

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

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

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

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

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

  3. 使用智能指针。

笔记:

  1. 内部碎片化

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

  3. Valgrind仪表框架。

  4. 使用后未释放的内存将导致碎片。
于 2016-05-12T12:39:42.903 回答