c语言 - 为什么即使我调用了free(),内存仍在增长?



这是一个简单的演示,只是循环malloc()free()

#include <cstdio>
#include <cstdlib>
#include <cmath>
int main(int argc, char **argv) {
int mallocTime = 100000;
for (int i=1; i<=mallocTime; i++) {
int size = (rand()%1024*1024*30);
char *a = (char*)malloc(size);
free(a);
}
int v; {
// Pause program.
scanf("%d", &v);
}
return 0;
}

我注意到,当mallocTime变大时,我的记忆力会增加.
这是mallocTime = 0时的内存状态

root     21416  0.0  0.0   6568  1712 pts/4    S+   20:53   0:00 ./a.out

虽然这时mallocTime = 100000

root     21786  0.0  0.5  37328 22204 pts/3    S+   20:55   0:00 ./a.out

如您所见,VSZ 和 RSS 都增长.
我想知道为什么,很明显我正确地释放了内存,为什么它仍然增长? 增长的内存字节数是多少?

大多数 glibc malloc 实现不会将内存返回到操作系统,除非:

  1. 您在mallopt中设置阈值。但根据我的经验,在向系统释放内存后,竞技场仍然由系统保留
  2. 调用将向系统释放内存的malloc_trimhttps://man7.org/linux/man-pages/man3/malloc_trim.3.html
  3. 按系统调用madvicehttps://man7.org/linux/man-pages/man2/madvise.2.html

不要投射 malloc 的结果。如果您的编译器抱怨,则意味着您使用C++编译器编译 C 代码,这不是一个好主意。

试试这个:

int main(void) {
size_t mallocTime = 100000;
srand((unsigned)time(NULL));
while(mallocTime--)
{
int size = (rand()%1024*1024*30);
char *a = malloc(size);
free(a);
malloc_trim(0);
}
int v; {
// Pause program.
scanf("%d", &v);
}
return 0;
}

相关内容

  • 没有找到相关文章

最新更新