const char* getString() {
std::string myString = "Hello!";
return myString.str().c_str();
}
如何让这个函数返回一个const char *
,它将超过声明它的本地范围?我相信我需要使用malloc
,但我不确定。
答案 0 :(得分:4)
我想你需要有一个string
的静态查找表,以便SymbolLookUp
可以返回c_str
值。
答案 1 :(得分:3)
看起来像SymbolLookup
API,您假设这些符号存储在准永久结构中而不是即时生成。如果你的符号非常短暂,你需要以某种方式使它们永久化,或者通过类似
return strdup(myString.c_str());
或更加惯用的C ++风格:
static std::vector<std::string> sStringPool;
sStringPool.push_back(myString);
return sStringPool.back().c_str();
当然,这将导致无限的内存增长,但如果你没有关于字符串生命周期的其他信息,那么几乎没有其他选择。如果你想变得聪明,你至少可以使字符串独一无二:
static std::set<std::string> sStringPool;
return sStringPool.insert(sStringPool.end(), myString)->c_str();
答案 2 :(得分:0)
只需返回std::string
并继续使用它。
请注意其生命周期,例如
const char* s = getString().c_str(); doStuff(s);
将导致第二个语句失败,因为getString
返回的临时字符串仅存在于语句结束之前。
如果您使用的API采用const char*
,则以下内容可行:
callTheAPI(getString().c_str());
然后该字符串将一直存在,直到API返回。
答案 3 :(得分:-1)
编辑:请注意,它回答了问题。在编辑时,似乎显而易见的是,这个问题与原始意图有误,但在合并之前无法提供改进的答案,如果可能的话。)
就是不要这样做。使用字符串类的重点是不使用malloc
和任何废话。如果您无法向适当稳定的现有位置提供const char*
,请从函数(或其他符合您口味的字符串类)返回std :: string。
答案 4 :(得分:-2)
const char* getString() {
std::string myString = "Hello!";
return myString.str().c_str();
}
1)正确的语法是myString.c_str()
2)该函数在堆栈上返回一个字符串,因此当您返回此类数据时,编译器会复制它或进行一些优化
3)请注意,它返回const char *
,这意味着绑定该返回值的正确方法是使用const char *returnValue = getString()
等语句,或者将其传递给需要const char的函数。并且因为我们正在从返回值来为C ++规范中的returnValue分配const char *
,所以这些数据将在函数的生命周期内传递。这意味着我们可以执行const char *str = getString()
,其中getString是您的函数,并且已定义并且getString()返回的值传递给函数的生命周期。
我发现您上面发布的代码没有任何必要的问题。