C++中按引用传递的局部list插入std::map后为何仍可正常访问?
执行逻辑说明
你观察到的现象是C++标准容器值语义的典型表现,具体运行流程如下:
- 你向
insert函数传入的是local_list的左值引用,这一步没有发生拷贝,但在执行m.insert({"ABC", list_to_insert})时会触发拷贝操作:map<string, list<int>>存储的元素类型是pair<const string, list<int>>,构造这个待插入的pair对象时,第二个参数list_to_insert是左值,会调用std::list的拷贝构造函数,把原local_list的所有元素完整复制一份独立的副本,作为pair的成员存入map的内部存储空间。 - 全局变量
m的生命周期和整个程序运行周期绑定,它内部存储的所有元素都在堆上独立分配,和setup函数栈上的local_list完全独立,没有依赖关系。 setup函数执行结束后,栈上的local_list确实会被销毁,但map中存储的拷贝不受任何影响,因此你在main函数中访问m["ABC"]时可以正常获取到数据。
你可以做个简单验证:在setup函数调用insert(local_list);之后新增代码修改local_list,比如添加local_list.clear();,此时再打印m["ABC"]的大小依然是4,就可以确认两份list是完全独立的实例。
内容的提问来源于stack exchange,提问作者vipman12
相关产品推荐
相关产品推荐

