我什么时候应该释放双指针?

时间:2018-05-31 05:24:19

标签: c pointers

我无法理解何时释放指针指针。对于数组,我理解类似:

char **mat = (char**) malloc(sizeof(char*) * 100);

for(int i = 0; i < 500; i++)
    mat[i] = (char*) malloc(sizeof(char) * 50);

需要

  1. 释放mat变量的每个 ith 成员,然后最后一次免费调用其根(mat **)。这直观有意义,因为每个malloc都是免费的。
  2. 然而,当我这样做的时候:

    char *str = (char *) malloc(100 * sizeof(char));
    char **pstr = &str;
    
    free(pstr);
    

    我发现这告诉我我试图释放无效指针。我的逻辑是如果pstr是指向malloc&#d; d字符数组的指针 - 释放pstr应该释放str。相反,我得到一个无效的指针。是什么给了什么?

2 个答案:

答案 0 :(得分:5)

char *str = (char *) malloc(100 * sizeof(char));
char **pstr = &str;

free(pstr); //WRONG

这是错误的。 pstr是某些automatic variable的地址(因此很可能位于call stack,而不是堆中)。它不是由malloc获得的,因此free - 禁止它(undefined behavior,即UB)。是UB的scared

指针是。你只能free一个指针(实际上是它所指向的内存块),它是malloccalloc之前(间接可能)获得的(这些可能会失败:你忘了{{ 3}})。

考虑定义一些handle failure of malloc。另请参阅Matrix abstract data type

请注意,在C 中编码时,约定非常非常重要。您需要定义,记录和遵循您自己的约定(关于谁负责free - 使用什么以及应该如何完成 - 可能使用this - 类似函数)。因此,研究现有 destructor的源代码(例如free software)应该是鼓舞人心的。

答案 1 :(得分:1)

分配的内存由*pstr指向,因此您必须free(*pstr)