Linux: glibc: 频繁调用new/delete会不会导致内存的碎片
最近同事问了一个问题:频繁调用new/delete会不会导致内存的碎片。
下面是我想到的一些回答,
glibc的内存处理机制,是在释放的时候会自动将小块内存整合成大块内存,为接下来满足大块的需求的可能。而且程序也不是一直占着内存不释放(如果是一直不释放,要考虑是不是内存泄漏),这个和磁盘的碎片化还有些不一样,因为文件的存储时间长的多。所以在大量小文件存在的情况下可能导致碎片空闲区域被浪费。
而且每个程序对空间的申请量大多是有固定的模式,比如程序里的某个结构体的大小,固定就是10K,那就有了固定模式申请10K,释放10K,这个内存可以被重复利用。
所以应该不会产生太多的碎片。
除非是程序接受外部的消息,遭受到不定长度消息的大量恶意攻击?而且程序的抵抗机制比较弱,还一直占着内存不释放。
chatGPT的回复:
在 Linux 系统中,使用 glibc 的内存分配器时,频繁调用 new 和 delete 的确可能导致内存碎片的产生。以下是原因分析及应对策略。
为什么会产生内存碎片?
- 小块内存频繁分配和释放
new 和 delete 底层依赖于 glibc 的 malloc 和 free。当程序频繁分配和释放不同大小的内存块时,某些内存块可能无法再次利用,导致内存碎片。
例如:申