如何释放c 2d阵列

时间:2011-04-14 16:11:03

标签: c memory-management

我有以下代码:

int **ptr = (int **)malloc(sizeof(int*)*N); 
for(int i=0;i<N;i++) 
     ptr[i]=(int*)malloc(sizeof(int)*N));

如何使用free释放ptr?我应该循环ptr和free ptr [i]吗?或者只是做

free(ptr) 

和ptr将被释放?

6 个答案:

答案 0 :(得分:14)

你必须循环遍历ptr [i],释放你遍历的每个int *,正如你的第一个建议。例如:

for (int i = 0; i < N; i++)
{
    int* currentIntPtr = ptr[i];
    free(currentIntPtr);
}

答案 1 :(得分:13)

恰好与分配相反:

for(int i = 0; i < N; i++)
    free(ptr[i]);
free(ptr);

答案 2 :(得分:4)

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

答案 3 :(得分:1)

for(int i=0;i<N;i++) free(ptr[i]);
free(ptr);

您没有检查malloc无法分配。你应该经常检查。

答案 4 :(得分:1)

简单

while (N) free(ptr[--N]);
free(ptr);

英俊

#define FALSE 0
#define TRUE 1
typedef int BOOL;

void freev(void **ptr, int len, BOOL free_seg) {
    if (len < 0) while (*ptr) {free(*ptr); *ptr++ = NULL;}
    else while (len) {free(ptr[len]); ptr[len--] = NULL;}
    if (free_seg) free(ptr);
}

freev(ptr, N, TRUE); /* if known length */
freev(ptr, -1, TRUE); /* if NULL-terminated */
freev(ptr, -1, FALSE); /* to keep array */

贵族

GLib功能:

如果没有GLib,我很难进行任何认真的C编程。它介绍了诸如dynamic strings之类的内容,并为foundations放置了functional programming。它实际上应该是标准C运行时库的一部分。它将使C呼吸新鲜空气。这将使C在 2019年再次成为一种合理且具有竞争力的语言。。但由于并非如此,它将为您的应用程序增加1 MB(无论是DLL大小还是可执行文件大小)。 Windows发行版也是maintained by sadists

答案 5 :(得分:-1)

__init__()