如果你看一下这段非常简单的代码:
#include <iostream>
using namespace std;
char* getText()
{
return "Hello";
}
int main()
{
char* text;
text = getText();
cout << text;
//delete text; // Calling delete results in an error
}
现在,我假设在getText()内的堆栈上分配了“Hello”字符串,这意味着一旦getText返回,指针就会“浮动”,我是对的吗?
如果我是对的,那么将“Hello”放在堆上的最佳方法是什么,所以我可以在getText之外使用该字符串,如果需要,可以在指针上调用delete?
答案 0 :(得分:5)
不,那里没有隐藏的堆栈分配。 "Hello"
是静态数据,最终会出现在程序的.data segment中。
这也意味着对getText
的所有呼叫共享字符串。如果您有大量错误消息映射到错误代码,则可以接受的常见用法是可接受的。像strerror
这样的函数就是这样的,因此您可以获得标准库错误代码的描述性错误消息。但是没有人应该修改strerror
的返回值(也因为它是const
)。在您的情况下,您的函数定义应为:
const char *getText()
如果您确实需要返回的字符串的私有副本,可以使用strdup
函数进行复制:
return strdup("Hello");
答案 1 :(得分:1)
这是不对的。 “Hello”是一个静态字符串常量,它实际上应该是const char *。
答案 2 :(得分:1)
使用std::string
标题中的<string>
。然后使用其.c_str()
成员函数。然后你不必关心分配和释放:它正确地为你照顾它。
干杯&amp;第h。,
答案 3 :(得分:0)
窄字符串文字的类型为“ n
const char
”数组,其中 n 是字符串的大小定义如下,具有静态存储时间。
静态存储既不是自动(“在堆栈上”)也不是动态(“在堆上”)。它是在程序的实际运行时之前分配的,因此指向字符串文字的指针永远不会变为无效。
请注意,char* p = "Hello"
已弃用,因为它很危险:类型系统无法阻止您尝试通过p
更改字符串文字(这会导致undefined behavior)。请改用const char* p = "Hello"
。