【问题标题】:how to deallocate the memory allocated to the malloc in following code?如何在以下代码中释放分配给 malloc 的内存?
【发布时间】:2010-12-02 01:09:41
【问题描述】:
           int n;
           int **arr;
           arr = (int**)malloc(n*sizeof(int));
           for (i=0; i<n; ++i){
          arr[i] = malloc(2*sizeof(int));

          }

[编辑]

      *** glibc detected *** ./abc: double free or corruption (out): 0x0000000002693370 
 ======= Backtrace: =========
 /lib/libc.so.6(+0x775b6)[0x7f42719465b6]
 /lib/libc.so.6(cfree+0x73)[0x7f427194ce53]
 ./abc[0x405f01]
 /lib/libc.so.6(__libc_start_main+0xfd)[0x7f42718edc4d]
 ./abc[0x400ee9]
 ======= Memory map: ========
00400000-00416000 r-xp 00000000 08:07 392882                             
 00616000-00617000 r--p 00016000 08:07 392882   

我尝试了以下提到的答案,但我得到了以下上述错误。这可能是什么原因?

[编辑]

上述问题现已解决。由于代码中存在错误。现在,我没有得到释放内存的任何改善。这可能是什么原因?

[编辑] 我正在使用一些模块来打印内存。以下是代码

     memory_Print();
     #ifdef CHECK
     memory_PrintLeaks();
      #endif

这里memory_PrintLeaks() 打印所需的内存和释放的内存。进行更改后我得到相同的值。

我想补充的一点是,我可以从程序的任何地方调用 free() 还是需要从某些特定位置调用,例如调用 malloc() 的位置或末尾程序?

【问题讨论】:

  • 你有一个错误。第一个mallocpointers 分配空间,而不是ints。函数调用应该是malloc(n*sizeof(int*))
  • 是的,它现在工作了。但是为什么在这样做之后内存泄漏对我来说也是一样的呢?我释放的内存没有任何改善。
  • 编辑您的代码以显示您如何free 内存。

标签: c memory-leaks


【解决方案1】:

free。您必须首先释放arr[i] 条目指向的内存,然后最后释放arr 指向的内存(它保存这些条目)。您不能反过来做,因为释放内存意味着您可能不再使用该内存中的值。

因此:

for (i = 0; i < n; ++i) {
    free(arr[i]);
}
free(arr);

【讨论】:

  • 我尝试了这里提到的,但出现了一些错误。我已经添加了它本身。你能告诉我出了什么问题吗?
【解决方案2】:
for (i=0; i<n; ++i){
    free(arr[i]);
}

free(arr);

顺便说一句,你应该确保你的分配没有失败,至少 arr 的分配没有失败,否则你最终会取消引用 NULL 指针。

【讨论】:

    【解决方案3】:

    您必须循环通过arr 和释放arr[i],然后在完成后释放 arr。您需要与 malloc 调用相同数量的免费调用。

    【讨论】:

      猜你喜欢
      • 2011-10-24
      • 2021-06-15
      • 2016-11-16
      • 1970-01-01
      • 2021-11-02
      • 2023-01-21
      • 1970-01-01
      • 2014-05-27
      • 2018-11-10
      相关资源
      最近更新 更多