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

C++函数内局部对象加入std::list后退出函数仍可访问原因求解

问题解答

你提到的「调用list.push_back(test &ref)时参数未被拷贝」,仅指参数传递阶段使用引用传递没有产生拷贝,不代表push_back内部不会对引用指向的对象做拷贝存储。

核心逻辑如下:

  • std::list<test>存储的是test类型的实例对象,而非指针或引用。它的push_back(const T&)重载在接收左值引用参数后,会在容器自身管理的堆内存区域,以引用指向的对象为源,拷贝构造出一个全新的独立对象存入容器。
  • func()栈上创建的局部test t只是拷贝构造的数据源,list中存储的新对象和它内存地址完全独立,生命周期和全局的list绑定,和栈上的t没有关联。
  • func()执行结束后,只会销毁栈上的局部t对象,list管理的堆内存中的拷贝对象仍然有效,所以后续访问list.front().t是合法操作,会正常输出34。

可以对照反例理解差异:如果容器声明为std::list<test*>,调用push_back(&t)存储局部对象的地址,那么func()退出后局部t被销毁,容器内存储的就是野指针,此时访问就会触发未定义行为。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:24:02