如何正确释放malloc'd结构?

时间:2014-03-02 17:36:00

标签: c malloc free

假设我有一个包含某些字段的malloc'd结构:

typedef struct myStruct {
    int integer;
    char* array;
    ...
    }

我malloc这个结构的数组但是,当我想释放它们时,我应该只是:

/* Loop */
free(myStruct[i])
myStruct[i] = NULL

free(myStruct)

或者我应该释放结构的每个字段,然后是结构本身吗?

3 个答案:

答案 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),您应该只有一个匹配的免费。