当我随机使用malloc()
s 和free()
s ,嵌套和不同大小时,在某些时候内存会被碎片化,因为这些操作会留下一大堆不连续的小内存区域,因此不能分配为更大的一块.
关于这个的几个问题:
如果经常这样做以致内存被迫碎片化,然后所有这些内存区域都是
free()
d,我可以假设这些空闲区域连接回其原始的连续大小吗?当我总是对相同的内存执行 a 并且从不嵌套这些调用时,当分配/释放的大小总是不同时,在这种情况下内存是否也会碎片化
malloc()
?free()
当我随机使用malloc()
s 和free()
s ,嵌套和不同大小时,在某些时候内存会被碎片化,因为这些操作会留下一大堆不连续的小内存区域,因此不能分配为更大的一块.
关于这个的几个问题:
如果经常这样做以致内存被迫碎片化,然后所有这些内存区域都是free()
d,我可以假设这些空闲区域连接回其原始的连续大小吗?
当我总是对相同的内存执行 a 并且从不嵌套这些调用时,当分配/释放的大小总是不同时,在这种情况下内存是否也会碎片化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++ 中,如果您打算让其他人从您的多态类继承,您可以将其析构函数声明为虚拟的。
使用智能指针。
笔记:
如果您要使用自己的内存管理系统,您可以考虑使用Boehm-Demers-Weiser垃圾收集器。
Valgrind仪表框架。