You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何返回std::vector<int>右值引用后,接收变量为空?

问题原因分析与解决方法

你的代码核心问题在于返回了局部对象的右值引用,导致后续构造的g访问了已销毁的内存:

  1. 函数f内部的s是局部变量,它的生命周期仅局限于f函数执行期间。当f执行到return语句后,s会被立即销毁,占用的内存也会被释放。
  2. 虽然std::move(s)把s转换成了右值引用,但这并没有改变s的生命周期——返回的引用指向的是一个即将被销毁的对象,属于悬空引用。
  3. 当main中执行auto g = f();时,试图用这个悬空引用来构造g,此时s已经不存在,移动构造操作实际是在操作已释放的内存,最终导致g成为空容器(这属于未定义行为的一种表现,更严重可能引发程序崩溃)。

修复方案

将函数f的返回类型改为值类型,直接返回容器:

std::vector<int> f() {
    std::vector<int> s;
    for (auto i : names) {
        s.push_back(this->f2(i));
    }
    return s; // 无需手动std::move,编译器会自动优化
}

当返回局部对象的值时,C++编译器会自动触发返回值优化(RVO),直接在调用方的内存空间构造s,完全避免拷贝;即使未触发优化,编译器也会自动将return s;处理为移动构造返回值,同时局部变量s的生命周期会被延长到返回值构造完成,确保数据能正确传递给g。

内容的提问来源于stack exchange,提问作者Sprout

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:32:22