我无法理解何时释放指向指针的指针。对于数组,我的理解是这样的:
char **mat = (char**) malloc(sizeof(char*) * 100);
for(int i = 0; i < 500; i++)
mat[i] = (char*) malloc(sizeof(char) * 50);
需要
- 释放 mat 变量的每个ith</em> 成员,然后对其根(mat**)进行最终释放调用。这直观上是有道理的,因为每个 malloc 都会获得一个空闲空间。
但是,当我这样做时:
char *str = (char *) malloc(100 * sizeof(char));
char **pstr = &str;
free(pstr);
我发现这告诉我我正在尝试释放无效的指针。我的逻辑是,如果 pstr 是指向 malloc 字符数组的指针 - 释放 pstr 应该释放 str。相反,我得到了一个无效的指针。给出了什么?
最佳答案
char *str = (char *) malloc(100 * sizeof(char)); char **pstr = &str; free(pstr); //WRONG
这是错误的。 pstr
是一些 automatic variable 的地址(因此很可能位于 call stack 上,而不是在堆中)。它不是由 malloc
获得的,因此禁止对其进行 free
操作( undefined behavior ,即 UB)。是scared布法罗大学。
指针是值。您只能释放
先前通过malloc
或calloc
(并且可能间接)获得的指针(实际上是它指向的内存块)这些可能会失败:您忘记了 handle failure of malloc
)。
考虑定义一些Matrix
abstract data type 。另请参阅this .
请注意,约定在使用 C 进行编码时非常非常重要。您需要定义、记录并遵循您自己的约定(关于谁负责free
-ing 的东西以及应该如何完成 - 也许使用 destructor 之类的函数)。因此研究现有的源代码free software (例如 github )应该是鼓舞人心的。
关于c - 我什么时候应该释放双指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50617177/