如何将本地std :: string复制到const char *?

时间:2013-06-14 14:16:55

标签: c++ malloc

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

如何让这个函数返回一个const char *,它将超过声明它的本地范围?我相信我需要使用malloc,但我不确定。

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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();

答案 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()返回的值传递给函数的生命周期。

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