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

如何在下面的代码中释放分配给malloc的内存?,c,memory-leaks,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)); } 上述问题现已解决。因为代码中有bug。现在,我没有得到的是释放内存的任何

我尝试了下面提到的答案,但我得到了上面提到的错误。原因是什么

[编辑]

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

          }
上述问题现已解决。因为代码中有bug。现在,我没有得到的是释放内存的任何改进。原因是什么

[编辑] 我正在使用一些模块来打印内存

      *** 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\u PrintLeaks()
打印所需的内存和释放的内存。在进行更改后,我将获得相同的值


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

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

因此:

(i=0;i{ 免费(arr[i]); } 免费(arr);
免费
。必须首先释放
arr[i]
项指向的内存,然后最后释放
arr
项指向的内存(保存这些项)。您不能反过来做,因为释放内存意味着您可能不再使用该内存中的值

因此:

(i=0;i{ 免费(arr[i]); } 免费(arr);
for(i=0;i
for(i=0;i你必须循环
arr
和free
arr[i]
,然后在你完成后释放arr。你需要与malloc调用相同数量的免费调用。

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

您有一个bug。第一个
malloc
是为
指针分配空间,而不是
int
。函数调用应该是
malloc(n*sizeof(int*)
是的,它现在起作用了。但是为什么在这样做之后内存泄漏对我来说也是一样的?我在释放的内存中没有得到任何改善。编辑你的代码以显示你如何
释放内存。你有一个bug。第一个
malloc
是为
指针分配空间,而不是
int
。函数调用应该是e> malloc(n*sizeof(int*))
是的,它现在起作用了。但是为什么在这样做之后,内存泄漏对我来说也是一样的?我释放的内存没有任何改善。编辑你的代码以显示你如何
释放内存。我尝试了这里提到的,但出现了一些错误。我添加了有问题的内存。你能告诉我哪里出了问题吗?我尝试了wi正如这里所提到的,但是有一些错误。我在问题中添加了它。你能告诉我哪里出了问题吗?
     memory_Print();
     #ifdef CHECK
     memory_PrintLeaks();
      #endif
for (i = 0; i < n; ++i) {
    free(arr[i]);
}
free(arr);
for (i=0; i<n; ++i){
    free(arr[i]);
}

free(arr);