【发布时间】:2010-05-20 15:11:57
【问题描述】:
请原谅我的 C 新手。
考虑以下 C 过程:
int doSomething() {
char *numbers="123456";
...
}
在此过程退出之前,我应该释放“数字”指针吗?
【问题讨论】:
请原谅我的 C 新手。
考虑以下 C 过程:
int doSomething() {
char *numbers="123456";
...
}
在此过程退出之前,我应该释放“数字”指针吗?
【问题讨论】:
不,你没有malloc 它。为什么要发布它?
通常,字符串被放置在可执行文件的只读部分中。
【讨论】:
free(numbers)。
在 C 语言中,您不能也不能“释放”指针。指针是普通的标量变量。在“释放”或类似的方面,您无法对它们做任何事情。
可以“释放”的是指针指向的内存。但在 C 中,您只需释放由malloc/calloc/realloc 明确分配的内存。这样的内存通过调用free释放。
再次注意,在您的程序中,您可能有几个(一百个)指向相同块已分配内存的指针。最终,您将不得不释放该内存块。但是无论您有多少指向该块的指针,您都必须恰好释放该内存块一次。您有责任确保释放它。你有责任确保你只发布了一次。我告诉你这个只是为了说明你释放的是内存块,而不是指针。
在您的示例中,您的指针指向的内存块从未被上述任何函数分配。这立即意味着您不需要发布任何内容。
【讨论】:
不,没有必要这样做,这样做是不正确的(感谢 dmckee)。该字符串将在二进制文件的data segment 中,因此无法释放。内存不是动态分配的。
“数字”会在栈上,所以当函数返回时它会消失。
【讨论】:
您实际上不需要调用 delete 或 free ,这些运算符仅用于清理已分配给我的运行时内存分配器的内存,例如 malloc、calloc、GlobalAlloC、HeapAlloc 等。当您像示例中那样定义指针时,实际上是在为可执行文件中的字符数组分配空间。所以更大的字符串长度更大将是可执行文件的大小,从而增加你的工作集。
【讨论】:
没有;没有什么可以释放的。字符串文字“123456”是一个具有静态范围的 char 数组(C++ 中的 const char)。它的内存在程序启动时分配并保留到程序退出。您所做的就是将字符串文字的地址分配给numbers;你实际上没有分配任何内存。
【讨论】:
NO,因为它不是由 malloc/calloc/realloc 分配的。
它将被自动“释放”,因为它是一个自动变量。
【讨论】:
不,它指向进程数据段中的预分配内存。只有free(3) 你所拥有的malloc(2)-ed(模一些库函数,如getaddrinfo(3)/freeaddrinfo(3)。)
【讨论】: