我无法理解何时释放指针指针。对于数组,我理解类似:
char **mat = (char**) malloc(sizeof(char*) * 100);
for(int i = 0; i < 500; i++)
mat[i] = (char*) malloc(sizeof(char) * 50);
需要
然而,当我这样做的时候:
char *str = (char *) malloc(100 * sizeof(char));
char **pstr = &str;
free(pstr);
我发现这告诉我我试图释放无效指针。我的逻辑是如果pstr
是指向malloc&#d; d字符数组的指针 - 释放pstr
应该释放str
。相反,我得到一个无效的指针。是什么给了什么?
答案 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
一个指针(实际上是它所指向的内存块),它是malloc
或calloc
之前(间接可能)获得的(这些可能会失败:你忘了{{ 3}})。
考虑定义一些handle failure of malloc
。另请参阅Matrix
abstract data type。
请注意,在C 中编码时,约定非常非常重要。您需要定义,记录和遵循您自己的约定(关于谁负责free
- 使用什么以及应该如何完成 - 可能使用this - 类似函数)。因此,研究现有 destructor的源代码(例如free software)应该是鼓舞人心的。
答案 1 :(得分:1)
分配的内存由*pstr
指向,因此您必须free(*pstr)
。