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

3
           int n;
           int **arr;
           arr = (int**)malloc(n*sizeof(int));
           for (i=0; i<n; ++i){
          arr[i] = malloc(2*sizeof(int));

          }

[EDIT]

      *** 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
你有一个 bug。第一个 malloc 分配的空间是用于指针而不是整数。函数调用应该是 malloc(n*sizeof(int*)) - Blastfurnace
是的,现在它可以工作了。但是为什么我在这样做之后内存泄漏仍然相同?我没有看到任何内存释放方面的改进。 - thetna
修改你的代码,展示如何释放内存。 - Blastfurnace
3个回答

7

使用free函数时,必须先释放arr[i]指向的内存,然后再释放arr指向的内存(即包含这些条目的内存)。不能反过来做,因为释放内存意味着您可能不再使用该内存中原有的值。

因此:

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

我按照这里所提到的方式尝试了一下,但是出现了一些错误。我已经在问题描述中添加了它。你能告诉我出了什么问题吗? - thetna

2
你需要遍历arr并释放arr[i],然后在完成后释放arr。你需要与malloc调用相同数量的free调用。

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

free(arr);

顺便提一下,您应该确保您的分配没有失败,至少是arr的分配,否则您将最终解除引用空指针。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接