当我随机使用malloc()
s和free()
s时,嵌套并且大小不同,在某个时候内存会被分割,因为这些操作留下了一大串不连续的小内存区域,因此无法作为一个更大的部分分配。
关于这个的几个问题:
-
当这种情况经常发生,导致内存被分割,然后所有这些内存区域都是
free()
d时,我能假设这些空闲区域被连接回其原始的连续大小吗? -
当我总是对同一内存执行
malloc()
和free()
,并且从不嵌套这些调用时,当分配/释放的大小总是不同时,在这种情况下,内存是否也是碎片化的?
不,没有保证。根据N1570,7.22.3内存管理功能:
对的连续调用所分配的存储的顺序和邻接性aligned_alloc、calloc、malloc和realloc函数是未指明。
无论如何,你有两个选择:
- 完全信任库内存管理功能
- 如果你真的很自信,就编写自己的内存管理器
如果我是你,我肯定会信任现有的功能,因为现代实现是超级智能的。
根据ISO/IEC 9899:201x->7.22.3
对的连续调用所分配的存储的顺序和邻接性aligned_alloc、calloc、malloc和realloc函数是未指明。
一个好的内存管理器将能够在一定程度上解决这个问题。然而,还有其他方面,如数据对齐[1],会导致内部碎片化。
如果你依赖内置内存管理,你能做什么
-
使用带有内存检查选项的探查器(比如valgrind)来查找使用后未释放的内存。示例:
valgrind --leak-check=yes myprog arg1 arg2
-
遵循良好做法。示例-在C++中,如果您希望其他人继承您的多态类,您可以将其析构函数声明为virtual。
-
使用智能指针。
注意:
-
内部碎片。
-
如果您要使用自己的内存管理系统,您可以考虑Boehm-Demers-Weiser垃圾收集器。
-
Valgrind仪器框架。
- 使用后未释放的内存将导致碎片化