【问题标题】:Why free() for array of poiters does not deallocate memory?为什么指针数组的 free() 不会释放内存?
【发布时间】:2018-04-25 16:03:32
【问题描述】:

我正在尝试在指针数组之后释放内存,如下代码所示:

int ** t = (int**) malloc(sizeof(int*)*10000000);
printf("1\n");
getchar();
for(int i =0; i < 10000000; i++){
    t[i] = (int*) malloc(sizeof(int));
    *t[i] = i;
}
printf("2\n");
getchar();

for(int i =0; i < 10000000; i++){
    free(t[i]);
}
printf("3\n");
getchar();

free(t);
printf("4\n");
getchar();

在执行期间,我的系统监视器向我显示了一些奇怪的值。当显示特定数字时(如代码中所示),我得到以下内存使用情况。

  1. 148K
  2. 390,540K
  3. 390,540K
  4. 312,676K

我有点困惑。为什么 2 和 3 中的数字相同?是我做错了什么,还是系统监视器不准确?如果是SM的错,为什么它注意到3和4之间的差异?

【问题讨论】:

  • 在虚拟内存系统上,系统倾向于在您实际使用内存之前不会提交页面。而free 往往不会将内存归还给操作系统。
  • "我得到以下内存使用情况" - 来自 where ??任务人??您实现的子分配器可能会将内存保留在空闲列表中,仍然从操作系统分配,但准备好进行另一轮(现在更快)分配。
  • 内存已经释放到堆,但是堆可能还没有释放到系统。没必要。
  • 如果你在 linux 上运行你的程序在 valgrind 下。这真的会告诉你内存是否被释放
  • 欢迎来到 Stack Overflow! Do I cast the return of malloc ?

标签: c memory-management memory-leaks malloc free


【解决方案1】:

free() 的行为取决于其底层实现。 free() 的大多数实现不会将释放的内存返回给操作系统,而只是将内存返回给池,malloc 请求从中得到满足,这仅仅意味着释放的内存现在可供重用该程序。检查this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2016-10-17
    • 2012-05-15
    • 2020-06-16
    • 1970-01-01
    相关资源
    最近更新 更多