【问题标题】:Why I don’t have to free string from c_str function of std::string?为什么我不必从 std::string 的 c_str 函数中释放字符串?
【发布时间】:2020-03-26 03:55:51
【问题描述】:

为什么我不必从 std::string 的 c_str 函数中释放字符串? 函数如何生成 const char* 以及如何销毁?

【问题讨论】:

  • @user4581301 这些将如何帮助 OP 了解他们不需要释放 c_str 返回的 原始指针 的原因?
  • 这能回答你的问题吗? What is std::string::c_str() lifetime?
  • RAII 链接解释了为什么他们不必释放内存背后的理念。三法则只是作为补充,因为它解释并解决了几乎所有新的 C++ 程序员在开始应用 RAII 时遇到的一个常见问题(然后通常尝试使用 new 解决)。
  • @user4581301 RAII 链接解释了为什么他们不必释放内存背后的哲学 RAII 本身没有回答 OP 的问题,因为 c_str() 返回一个原始指针.请参阅发布的答案以获取解决问题的答案示例。

标签: c++ string temporary-objects


【解决方案1】:

c_str() 返回的const char*std::string 本身管理,并在std::string 过期时被销毁。在这方面,必须注意不要在std::string 被销毁后尝试使用从c_str() 返回的指针:

const char* getName()
{
    std::string name = "Joe";
    return name.c_str();
}

上面是错误的,因为当name被破坏为getName返回时,指针会失效。

【讨论】:

  • 我记得早期版本的 C++ 规范说过 std::string 可能在内存中是不连续的(C++11 将其更改为要求它是连续的)。如果 c_str() 是 C++11 之前的非连续字符串,它会是什么样子?
  • @Dai 在这种情况下,字符串实现应该存储指向c_str返回的数据的指针,并在析构函数中释放它。
猜你喜欢
  • 2011-11-04
  • 1970-01-01
  • 2020-05-15
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 2011-01-17
  • 1970-01-01
相关资源
最近更新 更多