在临时字符串上使用 std::string::c_str() 安全吗?
在 C 中,std 的使用:临时字符串上的 :string::c_str() 一直是一个值得关注的主题。考虑以下代码片段:
void consumer(char const* p) { std::printf("%s", p); } std::string random_string_generator(); consumer(random_string_generator().c_str());
之所以出现这种问题,是因为在临时 std::string 对象上调用 std::string::c_str() 时,字符串对象的销毁似乎迫在眉睫。
但是,根据 C 11 标准,通过 std::string::c_str() 检索到的指针引用了字符串对象管理的内存,其有效性延伸直到:
在提供的代码片段中,临时字符串对象在完整表达式结束时(即调用consumer()之后)被销毁。因此,该代码被认为是安全的,因为通过 std::string::c_str() 检索的指针在调用 Consumer() 的整个过程中保持有效。
自 C 98 起就明确定义了临时对象的生命周期,与早期版本的 C 不同,它根据编译器而变化。因此,在早期版本中曾经不安全的代码现在在现代 C 编译器中被认为是安全的。
以上是在 C 中的临时字符串上使用 std::string::c_str() 是否安全?的详细内容。更多信息请关注PHP中文网其他相关文章!