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
相关产品推荐
相关产品推荐

