const char* getString() {
std::string myString = "Hello!";
return myString.str().c_str();
}
我怎样才能让这个函数返回一个const char *
超出声明它的本地范围的函数?我相信我需要使用malloc
,但我不确定。
我猜你需要有一个string
s 的静态查找表,以便SymbolLookUp
可以返回c_str
值。
看起来SymbolLookup
您正在使用的 API 假设符号存储在准永久结构中,而不是动态生成的。如果您的符号真的是瞬态的,您需要以某种方式使它们永久化,无论是 C 风格还是类似
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();
只需返回std::string
并继续使用它。
例如,请注意它的生命周期
const char* s = getString().c_str(); doStuff(s);
将导致第二个语句失败,因为返回的临时字符串getString
只存在到语句结束。
如果您使用的 API 采用const char*
,则以下内容将起作用:
callTheAPI(getString().c_str());
然后该字符串将一直存在,直到 API 返回。
编辑:请注意,它回答了所说的问题。在进行此编辑时,问题似乎很明显被错误地陈述为原始意图,但如果可能的话,在合并之前无法提供改进的答案。)
只是不要这样做。使用字符串类的重点是不要使用malloc
任何废话。如果您无法提供const char*
适当稳定的现有位置,请从函数(或其他符合您口味的字符串类)返回 std::string。
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 的函数时。而且因为我们const char *
从 C++ 规范中为 returnValue 分配了 a,所以该数据将在函数的生命周期内存活。所以这意味着我们可以const char *str = getString()
在 getString 是你的函数并且它被定义并且 getString() 返回的值通过了函数的生命周期。
我认为您在上面发布的代码没有任何必要的问题。