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

标签 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<​​/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布法罗大学。

指针是。您只能释放先前通过malloccalloc(并且可能间接)获得的指针(实际上是它指向的内存块)这些可能会失败:您忘记了 handle failure of malloc )。

考虑定义一些Matrix abstract data type 。另请参阅this .

请注意,约定在使用 C 进行编码时非常非常重要。您需要定义、记录并遵循您自己的约定(关于谁负责free-ing 的东西以及应该如何完成 - 也许使用 destructor 之类的函数)。因此研究现有的源代码free software (例如 github )应该是鼓舞人心的。

关于c - 我什么时候应该释放双指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50617177/

相关文章:

C Linux ioctl TCGETS 和 TCSETS errno 25

c - 为什么我不能用其他静态常量指针初始化静态常量指针?

c - C中变量的逻辑内存地址

c - 具有循环缓冲区的同步生产者和消费者

c - 将 double 转换为分数的函数

c++ - 如何在容器内强制执行两个独立类的父/派生关系?

c++ - 存储双指针地址并检索其值

c - C中带符号数的数组索引

c - 用指针声明的数组的大小

c++ - *restrict/*__restrict__ 在 C/C++ 中如何工作?