首页 >后端开发 >C++ >将临时 `std::string::c_str()` 传递给 C 中的函数是否安全?

将临时 `std::string::c_str()` 传递给 C 中的函数是否安全?

Barbara Streisand
Barbara Streisand原创
2024-11-06 22:51:03935浏览

Is it safe to pass a temporary `std::string::c_str()` to a function in C  ?

检查 std::string::c_str() 中临时字符串的持久性

在 C 编程领域,临时字符串的使用经常引起以下问题他们的内存管理和耐用性。本文深入探讨了将 std::string::c_str() 与临时字符串结合使用的具体细节,并检查其与 C 标准的一致性。

问题:

考虑以下代码片段:

void consumer(char const* p)
{
  std::printf("%s", p);
}

std::string random_string_generator();

consumer(random_string_generator().c_str());

代码是否表现出正确的行为,或者是否存在与临时对象的生命周期相关的潜在陷阱?

答案:

根据 C 标准,在创建临时 std::string 对象并获取其 c_str() 指针后,该 string 对象的生命周期将延长直至:

  • string 对象被调用
  • 字符串对象被显式析构

在提供的代码示例中,临时 std::string 对象 (random_string_generator()) 在完整的表达,而不是之前或之后。由于消费者是在同一表达式中调用的,因此代码被认为是格式良好的。

但是,值得注意的是,如果消费者要存储指针以供将来使用,则代码将不再安全。这是因为临时字符串对象的生命周期在消费者访问指针之前就已经结束了。

结论:

有问题的代码确实是格式良好的,根据符合 C 标准,只要它在同一表达式中使用即可。了解临时对象的生命周期规则对于避免内存管理问题并确保正确的程序行为至关重要。

以上是将临时 `std::string::c_str()` 传递给 C 中的函数是否安全?的详细内容。更多信息请关注PHP中文网其他相关文章!

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