int n;
int **arr;
arr = (int**)malloc(n*sizeof(int));
for (i=0; i<n; ++i){
arr[i] = malloc(2*sizeof(int));
}
Run Code Online (Sandbox Code Playgroud)
[编辑]
*** 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
Run Code Online (Sandbox Code Playgroud)
我尝试了下面提到的答案,但我得到了以下上面提到的错误.它可能是什么原因?
[编辑]
现在解决了上述问题.由于代码中存在错误.现在,我没有得到的是释放内存的任何改进.这可能是什么原因?
[编辑]我正在使用一些模块来打印内存.以下是代码
memory_Print();
#ifdef CHECK
memory_PrintLeaks();
#endif
Run Code Online (Sandbox Code Playgroud)
这里memory_PrintLeaks()打印所需的内存和释放的内存.我在进行更改后获得相同的值.
我要添加的另一个注释是,我可以在程序中的任何地方调用free(),或者需要从某个特定位置调用,例如调用malloc()的位置或程序结束时?
随着free.您必须首先释放arr[i]条目指向的内存,然后最终释放指向的内存arr(包含这些条目).你不能反过来做,因为释放内存意味着你可能不再使用该内存中的值.
从而:
for (i = 0; i < n; ++i) {
free(arr[i]);
}
free(arr);
Run Code Online (Sandbox Code Playgroud)