【问题标题】:When Should I Free a Double Pointer?我什么时候应该释放双指针?
【发布时间】:2018-11-10 01:06:51
【问题描述】:

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

char **mat = (char**) malloc(sizeof(char*) * 100);

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

需要

  1. 释放 mat 变量的每个 ith 成员,然后对其根(mat**)进行最终的免费调用。这在直觉上是有道理的,因为每个 malloc 都会获得一个免费的。

但是,当我这样做时:

char *str = (char *) malloc(100 * sizeof(char));
char **pstr = &str;

free(pstr);

我发现这告诉我我正在尝试释放无效指针。我的逻辑是如果pstr 是指向malloc'd 字符数组的指针的指针- 释放pstr 应该释放str。相反,我得到一个无效的指针。什么给了?

【问题讨论】:

  • 花几个小时阅读更多关于 C 和 C memory management 的信息。您需要定义并遵循关于分配和内存释放的约定
  • malloc 返回一个指针。你将那个指针传递(一个副本)到free。不是它的地址或其他任何东西。
  • 你不释放指针(双精度或其他),你使用指针释放对象。

标签: c pointers


【解决方案1】:
char *str = (char *) malloc(100 * sizeof(char));
char **pstr = &str;

free(pstr); //WRONG

这是错误的。 pstr 是一些automatic variable 的地址(所以很可能坐在call stack 上,而不是在堆中)。不是malloc获得的,所以free-ing是禁止的(undefined behavior,即UB)。成为UB的scared

指针是。您只能free 一个指针(实际上是它指向的内存块),该指针以前(可能间接地)由malloccalloc 获得(这些可能会失败:您忘记了handle failure of malloc)。

考虑定义一些Matrix abstract data type。另见this

请注意,约定在使用 C 编码时非常非常重要。你需要定义、记录和遵循你自己的约定(关于谁负责free-ing 的东西以及应该如何完成——也许使用destructor-like 函数)。所以研究现有 free software(例如github)的源代码应该是有启发性的。

【讨论】:

  • "某个自动变量的地址"。这是我需要意识到的。我有太多的指针概念在我脑海中转来转去。谢谢。
【解决方案2】:

分配的内存由*pstr 指向,所以你必须指向free(*pstr)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 2012-03-06
    • 2010-09-11
    相关资源
    最近更新 更多