返回字符串的生命周期及其.c_str()

时间:2016-12-20 10:52:22

标签: c++ string std stdstring

我遇到过这种模式的多个实例(仅使用boost :: filesystem作为示例):

boost::filesystem::path path = ...;
someFunctionTakingCStrings(path.string().c_str());

,其中

const std::string path::string() const
{
  std::string tmp = ...
  return tmp;
}

虽然我从未遇到过这种模式的问题,但我想知道sting()返回的字符串何时被销毁以及访问c_str()的代码是否安全c_str() lifetime is bound to std::string lifetime。< / p>

1 个答案:

答案 0 :(得分:3)

someFunctionTakingCStrings(path.string().c_str());是安全的,因为标准保证匿名临时path.string()的生命周期能够在函数调用中存活。因此c_str()返回的指针是someFunctionTakingCStrings的有效参数。

const std::string path::string() const是安全的,因为从概念上讲,您将返回tmp的值副本,但实际上编译器会优化值副本(名为的过程名为返回值优化< / em>的)。

const std::string& path::string() const这样的函数体具有与 相同的函数体(因为引用将悬挂),并且

const char* ub_server()
{
    std::string s = "Hello";
    return s.c_str();
}

也是未定义的,因为函数返回时s超出了范围。

最后,请注意,在标准C ++中,将指向匿名临时的指针作为函数调用中的参数是虽然令人讨厌,但Visual C ++允许它作为扩展。