C:从堆栈内存返回 std::string 引用

新手上路,请多包涵

我首先要说我已经阅读了这个主题: C++ Return reference / stack memory 。但是,问题在于 std::vector<int> 作为对象类型。但我虽然 std::string 的行为不同。这个类不是专门为使用字符串而设计的,而不必担心内存泄漏和错误使用内存吗?

所以,我已经知道这是错误的:

 std::vector<t> &function()
{
    vector<t> v;
    return v;
}

但这也是错误的吗?

 std::string &function()
{
    string s = "Faz";
    s += "Far";
    s += "Boo";
    return s;
}

谢谢


额外问题(编辑): 所以,当我说 返回(按值) 一个 std::string 时,我是否正确,它不会复制字符序列,只是一个指向 char * 数组的指针和一个 size_t 长度?

如果这个陈述是正确的,这是创建一个字符串的深层副本的有效方法(以避免一次操作两个字符串)吗?

 string orig = "Baz";
string copy = string(orig);

原文由 Martijn Courteaux 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 687
2 个回答

您真的很接近使这些功能起作用:

 std::string function()
{
    string s = "Faz";
    s += "Far";
    s += "Boo";
    return s;
}

只需让他们返回一个副本而不是一个参考,你就设置好了。这就是您想要的,基于堆栈的字符串的副本。

它也变得更好了,因为返回值优化 (RVO) 只会创建一次字符串并返回它,就像您在堆上创建它并返回对它的引用一样,所有这些都在幕后!

原文由 Blindy 发布,翻译遵循 CC BY-SA 3.0 许可协议

类型无关紧要。对于任何对象类型 T ,这种模式总是完全错误的:

 T& f() {
    T x;
    return x;
}   // x is destroyed here and the returned reference is thus unusable

如果从函数返回引用,则必须确保它所引用的对象在函数返回后仍然存在。由于具有自动存储持续时间的对象在声明它们的块的末尾被销毁,因此保证它们在函数返回后 存在。

原文由 James McNellis 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题