如何释放c 2d阵列

lin*_*ina 19 c memory-management

我有以下代码:

int **ptr = (int **)malloc(sizeof(int*)*N); 
for(int i=0;i<N;i++) 
     ptr[i]=(int*)malloc(sizeof(int)*N));
Run Code Online (Sandbox Code Playgroud)

我怎样才能免费使用ptr free?我应该循环ptr和free ptr [i]吗?或者只是做

free(ptr) 
Run Code Online (Sandbox Code Playgroud)

和ptr将被释放?

Jam*_*ord 15

您将不得不循环遍历ptr [i],释放您遍历的每个int*,如您最初建议的那样.例如:

for (int i = 0; i < N; i++)
{
    int* currentIntPtr = ptr[i];
    free(currentIntPtr);
}
Run Code Online (Sandbox Code Playgroud)

  • 出于好奇,只用 `free(ptr[i])` 遍历循环有什么问题? (3认同)
  • 没什么,我可能有点太难以让我的代码在这里可读! (2认同)

Don*_*alo 13

恰好与分配相反:

for(int i = 0; i < N; i++)
    free(ptr[i]);
free(ptr);
Run Code Online (Sandbox Code Playgroud)

  • @VaradBhatnagar:这实际上是未定义的行为。可能是分段错误 - 谁知道! (2认同)

Rob*_*obᵩ 8

是的,您必须循环ptr并释放每个ptr[i]. 为避免内存泄漏,一般规则是:对于每个malloc(),必须恰好有一个对应的free()


7vu*_*0hy 7

简单的

\n\n
while (N) free(ptr[--N]);\nfree(ptr);\n
Run Code Online (Sandbox Code Playgroud)\n\n

英俊的

\n\n
#define FALSE 0\n#define TRUE 1\ntypedef int BOOL;\n\nvoid freev(void **ptr, int len, BOOL free_seg) {\n    if (len < 0) while (*ptr) {free(*ptr); *ptr++ = NULL;}\n    else while (len) {free(ptr[len]); ptr[len--] = NULL;}\n    if (free_seg) free(ptr);\n}\n\nfreev(ptr, N, TRUE); /* if known length */\nfreev(ptr, -1, TRUE); /* if NULL-terminated */\nfreev(ptr, -1, FALSE); /* to keep array */\n
Run Code Online (Sandbox Code Playgroud)\n\n

贵族

\n\n

GLib函数:

\n\n\n\n

我发现如果没有 GLib,就很难进行任何严肃的 C 编程。它介绍了动态字符串等内容,并为函数式编程奠定了基础。它确实应该是标准 C 运行时库的一部分。这会让C呼吸新鲜空气。这将使 C在 2019 年再次成为一种合理且有竞争力的语言。但因为它不是 \xe2\x80\x99t,所以它将为您的应用程序增加 1 MB(无论是 DLL 大小还是可执行文件大小)。Windows 发行版也是由虐待狂维护的

\n