返回字符串及其 .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++ 允许将其作为扩展。
我遇到过这种模式的多个实例(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++ 允许将其作为扩展。