内存碎片
Memory fragmentation
当我随机使用 malloc()
s 和 free()
s 时,嵌套且大小不同,在某些时候内存会碎片化,因为这些操作会留下一大堆小内存区域是不连续的,因此不能分配为一个更大的部分。
关于这个的几个问题:
当经常这样做以至于内存被强制碎片化然后所有这些内存区域是free()
d,我可以吗假设这些空闲区域连接回其原始的连续大小?
当我总是对同一个内存执行 malloc()
后跟 free()
并且从不嵌套这些调用时,当 allocated/freed 尺寸总是不同的?
不,无法保证。根据 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.
无论如何,你有两个选择:
- 完全信任库内存管理功能。
- 如果您真的有信心,请编写您自己的内存管理器。
如果我是你,我肯定会相信现有的功能,因为现代实现非常智能。
根据 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] 会导致内部碎片。
如果依赖内置内存管理,你能做什么?
使用带有内存检查选项的分析器(比如 valgrind)来查找使用后未释放的内存。
示例:
valgrind --leak-check=yes myprog arg1 arg2
遵循好的做法。示例 - 在 C++ 中,如果您希望其他人继承您的多态 class,您可以将其析构函数声明为虚拟的。
使用智能指针。
备注:
如果你要使用自己的内存管理系统,你可以考虑Boehm-Demers-Weiser垃圾收集器。
Valgrind 仪表框架。
- 使用后未释放的内存会导致碎片化。
当我随机使用 malloc()
s 和 free()
s 时,嵌套且大小不同,在某些时候内存会碎片化,因为这些操作会留下一大堆小内存区域是不连续的,因此不能分配为一个更大的部分。
关于这个的几个问题:
当经常这样做以至于内存被强制碎片化然后所有这些内存区域是
free()
d,我可以吗假设这些空闲区域连接回其原始的连续大小?当我总是对同一个内存执行
malloc()
后跟free()
并且从不嵌套这些调用时,当 allocated/freed 尺寸总是不同的?
不,无法保证。根据 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.
无论如何,你有两个选择:
- 完全信任库内存管理功能。
- 如果您真的有信心,请编写您自己的内存管理器。
如果我是你,我肯定会相信现有的功能,因为现代实现非常智能。
根据 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] 会导致内部碎片。
如果依赖内置内存管理,你能做什么?
使用带有内存检查选项的分析器(比如 valgrind)来查找使用后未释放的内存。 示例:
valgrind --leak-check=yes myprog arg1 arg2
遵循好的做法。示例 - 在 C++ 中,如果您希望其他人继承您的多态 class,您可以将其析构函数声明为虚拟的。
使用智能指针。
备注:
如果你要使用自己的内存管理系统,你可以考虑Boehm-Demers-Weiser垃圾收集器。
Valgrind 仪表框架。
- 使用后未释放的内存会导致碎片化。