假设我有一个包含某些字段的malloc'd结构:
typedef struct myStruct {
int integer;
char* array;
...
}
我malloc这个结构的数组但是,当我想释放它们时,我应该只是:
/* Loop */
free(myStruct[i])
myStruct[i] = NULL
free(myStruct)
或者我应该释放结构的每个字段,然后是结构本身吗?
答案 0 :(得分:4)
如果你这样叫malloc:
myStruct *s = malloc(sizeof(myStruct ));
然后你应该在malloc返回的任何指针上调用free(在本例中称为s
):
free(s);
如果你像这样调用malloc,那就是同样的事情:
myStruct *s = malloc(sizeof(myStruct) * NUM_IN_ARRAY);
//...
free(s);
虽然,如果您之前已经为结构中的char *字段分配了malloc指针,请记住您也需要释放它。
答案 1 :(得分:2)
如果您的char* array
值单独malloc
,则需要循环遍历struct
数组的每个元素并先释放它们 - 否则您最终会得到“无法访问”的内存和因此泄漏。
唯一不重要的是终止程序 - 任何你没有清理的东西都会为你完成。
可能的代码示例:
typedef struct myStruct {
int integer;
char* array;
...
}
myStruct* A;
int N;
A = malloc(N * sizeof *A);
for(int ii=0; ii<N; ii++) A[ii].array = malloc(20);
现在,如果你做了
free(A); A=NULL; // ****** BAD - DON'T DO IT ******
你最终会发生内存泄漏。相反,您需要遍历每个元素,并释放结构中的数组:
for(int ii=0; ii<N; ii++) {
free(A[ii].array);
A[ii].array=NULL;
}
free(A); A=NULL;
答案 2 :(得分:0)
你应该释放你所分配的内容。
因此,对于每个malloc(或strdup),您应该只有一个匹配的免费。