我无法理解何时释放指向指针的指针。对于数组,我理解如下:
char **mat = (char**) malloc(sizeof(char*) * 100);
for(int i = 0; i < 500; i++)
mat[i] = (char*) malloc(sizeof(char) * 50);
将需要
- 释放 mat 变量的每个第 i 个成员,然后对其根(mat**(进行最终自由调用。这在直觉上是有道理的,因为每个 malloc 都会获得一个免费。
但是,当我做这样的事情时:
char *str = (char *) malloc(100 * sizeof(char));
char **pstr = &str;
free(pstr);
我发现这告诉我我正在尝试释放无效指针。我的逻辑是,如果pstr
是指向 malloc'd 字符数组的指针 - 释放pstr
应该释放str
。相反,我得到一个无效的指针。什么给?
char *str = (char *) malloc(100 * sizeof(char)); char **pstr = &str; free(pstr); //WRONG
这是错误的。pstr
是某个自动变量的地址(因此可能位于调用堆栈上,而不是堆中(。它不是通过malloc
获得的,所以free
-ing是被禁止的(未定义的行为,即UB(。害怕 UB。
指针是值。您只能free
先前由malloc
或calloc
获得(可能是间接获得的(指针(实际上是它指向的内存块((这些可能会失败:您忘记处理malloc
失败(。
考虑定义一些Matrix
抽象数据类型。另请参阅此内容。
请注意,在 C 语言中编码时,约定非常重要。你需要定义、记录和遵循你自己的约定(关于谁负责free
的东西以及如何完成 - 也许使用类似析构函数的函数(。因此,研究现有自由软件的源代码(例如在github上(应该是鼓舞人心的。
分配的内存按*pstr
指向,因此您必须free(*pstr)
。