3
const char* getString() {
  std::string myString = "Hello!";
  return myString.str().c_str();
}

我怎样才能让这个函数返回一个const char *超出声明它的本地范围的函数?我相信我需要使用malloc,但我不确定。

4

5 回答 5

5

我猜你需要有一个strings 的静态查找表,以便SymbolLookUp可以返回c_str值。

于 2013-06-14T14:40:46.967 回答
3

看起来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();
于 2013-06-14T14:42:44.037 回答
0

只需返回std::string并继续使用它。

例如,请注意它的生命周期

const char* s = getString().c_str(); doStuff(s);

将导致第二个语句失败,因为返回的临时字符串getString只存在到语句结束。

如果您使用的 API 采用const char*,则以下内容将起作用:

callTheAPI(getString().c_str());

然后该字符串将一直存在,直到 API 返回。

于 2013-06-14T14:24:13.593 回答
-1

编辑:请注意,它回答了所说的问题。在进行此编辑时,问题似乎很明显被错误地陈述为原始意图,但如果可能的话,在合并之前无法提供改进的答案。)

只是不要这样做。使用字符串类的重点是不要使用malloc任何废话。如果您无法提供const char*适当稳定的现有位置,请从函数(或其他符合您口味的字符串类)返回 std::string。

于 2013-06-14T14:22:34.113 回答
-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 的函数时。而且因为我们const char *从 C++ 规范中为 returnValue 分配了 a,所以该数据将在函数的生命周期内存活。所以这意味着我们可以const char *str = getString()在 getString 是你的函数并且它被定义并且 getString() 返回的值通过了函数的生命周期。

我认为您在上面发布的代码没有任何必要的问题。

于 2013-06-14T14:43:16.443 回答