首页  >  文章  >  后端开发  >  在 C 中的临时字符串上使用 std::string::c_str() 是否安全?

在 C 中的临时字符串上使用 std::string::c_str() 是否安全?

Linda Hamilton
Linda Hamilton原创
2024-11-11 11:42:02361浏览

Is it Safe to Use std::string::c_str() on Temporary Strings in C  ?

在临时字符串上使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn