这个C指针需要释放吗?

4
请原谅我对C语言的生疏。
考虑以下C程序:
int doSomething() {
    char *numbers="123456";
    ...
}

在此过程退出之前,我是否应该释放“numbers”指针?
7个回答

9

不,你没有使用malloc分配它。那么为什么要释放它呢?

通常,该字符串被放置在可执行文件的只读区域。


2
不仅没有理由释放它,而且有非常充分的理由不调用free(numbers) - David Thornley

4
在C语言中,你不能“释放”指针,因为指针是普通的标量变量。你不能对它们进行“释放”或类似的操作。你可以“释放”的是指针所指向的内存。但在C语言中,你只需要释放由malloc/calloc/realloc显式分配的内存。通过调用free函数来释放这些内存。需要注意的是,在程序中可能会有多个指针指向同一个已分配的内存块。最终,你必须释放该内存块。无论有多少指针指向该块,你都必须确保只释放一次。这是你的责任。我告诉你这些只是为了说明释放的是内存块,而不是指针。
在你的例子中,你的指针指向一个从未被上述函数之一分配的内存块。这意味着你不需要释放任何东西。

3
不,无需这样做,这样做是不正确的(感谢dmckee)。字符字符串将位于二进制文件的data segment中,因此它不能被释放。内存并非动态分配。
“数字”将在堆栈上,所以当函数返回时,它将消失。

2

您实际上不需要调用delete或free,这些运算符仅用于清除已由运行时内存分配器(如malloc,calloc,GlobalAlloc,HeapAlloc等)分配的内存。当您像示例中那样定义指针时,实际上是在可执行文件中为字符数组分配空间。因此,字符串长度越大,可执行文件大小就越大,从而增加了您的工作集。


1
不需要释放任何东西。字符串字面量“123456”是一个带静态范围的字符数组(在C++中是const char),它的内存在程序启动时分配,并保留到程序退出。你所做的只是将字符串字面量的地址赋给了“numbers”;你并没有实际分配任何内存。

0
不,它指向进程数据段中预分配的内存。只有在你使用malloc(2)分配了内存后才能使用free(3)释放它(除了一些库函数,如getaddrinfo(3)/freeaddrinfo(3))。

0

不会,因为它没有通过 malloc/ calloc / realloc 分配。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接