【问题标题】:Should this C pointer be released?是否应该释放这个 C 指针?
【发布时间】:2010-05-20 15:11:57
【问题描述】:

请原谅我的 C 新手。

考虑以下 C 过程:

int doSomething() {
    char *numbers="123456";
    ...
}

在此过程退出之前,我应该释放“数字”指针吗?

【问题讨论】:

    标签: c memory


    【解决方案1】:

    不,你没有malloc 它。为什么要发布它?

    通常,字符串被放置在可执行文件的只读部分中。

    【讨论】:

    • 不仅没有理由发布它,还有很好的理由不打电话给free(numbers)
    【解决方案2】:

    在 C 语言中,您不能也不能“释放”指针。指针是普通的标量变量。在“释放”或类似的方面,您无法对它们做任何事情。

    可以“释放”的是指针指向的内存。但在 C 中,您只需释放由malloc/calloc/realloc 明确分配的内存。这样的内存通过调用free释放。

    再次注意,在您的程序中,您可能有几个(一百个)指向相同块已分配内存的指针。最终,您将不得不释放该内存块。但是无论您有多少指向该块的指针,您都必须恰好释放该内存块一次。您有责任确保释放它。你有责任确保你只发布了一次。我告诉你这个只是为了说明你释放的是内存块,而不是指针。

    在您的示例中,您的指针指向的内存块从未被上述任何函数分配。这立即意味着您不需要发布任何内容。

    【讨论】:

      【解决方案3】:

      不,没有必要这样做,这样做是不正确的(感谢 dmckee)。该字符串将在二进制文件的data segment 中,因此无法释放。内存不是动态分配的。

      “数字”会在栈上,所以当函数返回时它会消失。

      【讨论】:

        【解决方案4】:

        您实际上不需要调用 delete 或 free ,这些运算符仅用于清理已分配给我的运行时内存分配器的内存,例如 malloc、calloc、GlobalAlloC、HeapAlloc 等。当您像示例中那样定义指针时,实际上是在为可执行文件中的字符数组分配空间。所以更大的字符串长度更大将是可执行文件的大小,从而增加你的工作集。

        【讨论】:

          【解决方案5】:

          没有;没有什么可以释放的。字符串文字“123456”是一个具有静态范围的 char 数组(C++ 中的 const char)。它的内存在程序启动时分配并保留到程序退出。您所做的就是将字符串文字的地址分配给numbers;你实际上没有分配任何内存。

          【讨论】:

            【解决方案6】:

            NO,因为它不是由 malloc/calloc/realloc 分配的。

            它将被自动“释放”,因为它是一个自动变量。

            【讨论】:

              【解决方案7】:

              不,它指向进程数据段中的预分配内存。只有free(3) 你所拥有的malloc(2)-ed(模一些库函数,如getaddrinfo(3)/freeaddrinfo(3)。)

              【讨论】:

                猜你喜欢
                • 2015-03-11
                • 1970-01-01
                • 2014-08-13
                • 1970-01-01
                • 1970-01-01
                • 2011-06-02
                • 2012-01-08
                • 2018-11-10
                • 2015-05-20
                相关资源
                最近更新 更多