为什么我不需要在使用std::string的c_str函数后释放字符串?

4
为什么我不需要从std :: string的c_str函数中释放字符串? 该函数如何生成const char *并如何销毁它?

@user4581301 这些方法中的任何一个都能帮助OP理解为什么他们不需要释放c_str返回的原始指针 - undefined
RAII链接解释了为什么他们不需要手动释放内存的哲学。三法则只是额外添加的补充,因为它解释并解决了几乎所有新的C ++程序员在开始应用RAII后遇到的常见问题(通常尝试使用new来解决)。 - undefined
@user4581301 RAII链接解释了为什么不需要手动释放内存的哲学原理 RAII本身并没有回答提问者的问题,因为c_str()返回的是一个原始指针。请参考已发布的答案,其中包含了一个确切回答该问题的示例。 - undefined
这个回答解决了你的问题吗?std::string.c_str()或std::string.data()返回的指针需要被释放吗? - undefined
@user4815162342 如果你仍然认为这个问题是重复的,请再次投票。这样它就不会被遗忘了。 - undefined
显示剩余2条评论
1个回答

4

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++11之前的非连续字符串,那么c_str()数据会是什么样子呢? - undefined
在这种情况下,字符串的实现应该将指针存储为c_str返回的数据,并在析构函数中释放它。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接