如何在以下代码中释放分配给malloc的内存?

时间:2010-12-02 01:09:41

标签: c memory-leaks

           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()的位置或最后该计划?

3 个答案:

答案 0 :(得分:6)

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

因此:

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

答案 1 :(得分:1)

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

free(arr);

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

答案 2 :(得分:1)

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