const char* getString() {
std::string myString = "Hello!";
return myString.str().c_str();
}
我该如何使这个函数返回一个在声明它的局部作用域之外仍然有效的 const char *
? 我相信我需要使用 malloc
,但我不确定。
我猜你需要一个静态的字符串查找表,这样SymbolLookUp
才能返回c_str
值。
c_str
值。 - RouteMapperstd::string
或使迭代器失效的操作。 - BoBTFishstd::string
,并且只返回它们对应的c_str
值。 - RouteMapperSymbolLookup
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();
strdup
在堆上分配了字符串的副本。 - microtherion只需返回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 *
表示。API开发人员从未自己查找符号;他们将此留给API用户。因此,它实际上与我的问题相匹配。 - RouteMapperconst 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 *
分配给returnValue,根据C++规范,该数据将在函数的生命周期之后存在。因此,这意味着我们可以执行const char *str = getString()
,其中getString是您的函数,并且已定义并且由getString()返回的值在函数的生命周期之后存在。
我没有看到您发布的代码中有任何必要的问题。
std::string
,你可以将该临时对象绑定到一个 const
引用上,并延长其生命周期。 - BoBTFishconst char *str="hello"; return str;
,这些应该会一直保存在内存中,直到应用程序的生命周期结束,因为它们被放置在文本段内存中。但是对于 std::string,它所指向的 char 会被删除。我的错误。 - dchhetri
std::string
并将其保留即可。需要char const*
时使用s.c_str()
。任何解决方案都等同于重新发明std::string
。 - R. Martinho Fernandesconst char*
吗? - Oliver Charlesworthchar *
的预期寿命吗?这个 API 是否会free
它?delete
它?是不是 你的 代码在某个时候负责销毁它?通过将std::string
转换为char *
,你已经失去了自动寿命管理。 - Drew Dormann