gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:14:39 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com