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



我无法理解何时释放指向指针的指针。对于数组,我理解如下:

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

将需要

  1. 释放 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先前由malloccalloc获得(可能是间接获得的(指针(实际上是它指向的内存块((这些可能会失败:您忘记处理malloc失败(。

考虑定义一些Matrix抽象数据类型。另请参阅此内容。

请注意,在 C 语言中编码时,约定非常重要。你需要定义、记录和遵循你自己的约定(关于谁负责free的东西以及如何完成 - 也许使用类似析构函数的函数(。因此,研究现有自由软件的源代码(例如在github上(应该是鼓舞人心的。

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

最新更新