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

标签 c++ memory-management reference

首先我会说我已经阅读了这个主题: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);

最佳答案

类型是什么并不重要;对于任何对象类型 T,此模式始终是完全错误的,100% 错误:

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

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

关于C++:从堆栈内存返回 std::string 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6388698/

相关文章:

java - 将变量添加到集合后删除它

c++ - 验证指针链

c++ - 如何从(binary == true)boost::beast::websocket::stream <tcp::socket>将 'read'放入缓冲区(boost::beast::flat_buffer?),以便它不被转义?

c++ - 提取模板类默认参数

iOS 从文档目录中高效解析大型 JSON

ios - 为什么这个 for 循环会耗尽内存?

reference - 如何为 Rust 中的计算图节点重载 Add

c++ - 为什么 _CrtSetDumpClient 不起作用?

c++ - 为什么释放堆内存比分配它慢得多?

MySQL 向表中插入数据,外键不是引用表的主键