最近,我在调试程序时遇到了一个奇怪的错误。我们分配了一个大缓冲区。释放后,内存没有返回给操作系统。接下来的分配可能会因为内存不足而失败。然后我编写了下面的测试程序。我为指针c
分配了内存,并没有使用free
来模拟我的真实程序中由OpenMPI调用引起的小型内存泄漏。
在一个剩余3 GB内存的电脑(Mac)上,它将在第18行失败,因为内存不足。我知道指针c
会导致内存碎片。但是对于这些像a
和b
这样的大内存缓冲区,它们是通过mmap
而不是brk
进行分配的。它们应该能够直接被释放,对吧?我该怎么解决这个问题呢?
#include <stdlib.h>
#include <string.h>
int main(){
float *a=malloc(1250000000);
memset(a, (char)1, 1250000000);
float *b=malloc(1250000000);
memset(b, (char)1, 1250000000);
float *c=malloc(10);
memset(c, (char)1, 10);
free(b);
free(a);
float *d=malloc(2000000000); /* FAILS HERE */
memset(d, (char)1, 2000000000);
}
calloc
,malloc
等的失败...并可能禁用内存过度承诺。 - Basile Starynkevitch