为何返回std::vector<int>右值引用后,接收变量为空?
问题原因分析与解决方法
你的代码核心问题在于返回了局部对象的右值引用,导致后续构造的g访问了已销毁的内存:
- 函数
f内部的s是局部变量,它的生命周期仅局限于f函数执行期间。当f执行到return语句后,s会被立即销毁,占用的内存也会被释放。 - 虽然
std::move(s)把s转换成了右值引用,但这并没有改变s的生命周期——返回的引用指向的是一个即将被销毁的对象,属于悬空引用。 - 当
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
相关产品推荐
相关产品推荐

