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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:45:06