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

Lifetime of returned strings and their .c_str()

我遇到过这种模式的多个实例(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 一样安全.

someFunctionTakingCStrings(path.string().c_str()); 是安全的,因为标准保证匿名临时 path.string() 的生命周期在函数调用后仍然存在。所以由 c_str() 编辑的指针 return 是 someFunctionTakingCStrings.

的有效参数

const std::string path::string() const 是安全的,因为从概念上讲,您正在 return 获取 tmp 的值副本,尽管实际上编译器会优化值副本(称为 return 的值副本=29=]命名return值优化).

类似 const std::string& path::string() const 的函数体与您的函数体相同 不会 被定义(因为引用会 dangle), 和

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

也是未定义的,因为 s 在函数 returns 时超出范围。

最后,请注意,在函数调用中将指向匿名临时对象的指针作为参数在标准 C++ 中是不允许的,尽管令人讨厌的是,Visual C++ 允许将其作为扩展。