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

列表初始化的std::initializer_list销毁后访问元素是否为未定义行为?

该程序存在明确的未定义行为

核心原因:std::initializer_list的生命周期问题

当你用{1,2,3}这类初始化列表构造ArrayRef对象时,会生成一个临时的std::initializer_list<int64_t>对象,这个临时对象及其指向的底层数组的生命周期仅持续到ArrayRef构造函数执行完毕。

你的ArrayRef构造函数保存了这个临时initializer_list的begin()指针(即底层数组的首地址),但构造函数结束后,该底层数组就会被销毁。后续在main函数中调用s.front()和s.back()时,本质是在访问已经被释放的栈内存,这完全符合C++标准定义的未定义行为。

关于编译器表现差异的说明

GCC 14.2没有触发-fsanitize=address警告只是巧合:编译器的内存布局或优化策略可能让这块内存暂时未被覆盖,导致 sanitizer 没检测到问题,但这绝不代表程序合法。未定义行为的表现本就不可预测,不同编译器、同一编译器的不同版本都可能给出不同结果——有的看似正常运行,有的直接崩溃,有的触发内存检测警告。

补充C++标准规则

根据C++标准,std::initializer_list的底层数组是临时对象,其生命周期与初始化列表表达式的生命周期绑定。用初始化列表初始化对象时,对应的initializer_list临时对象会在目标对象构造完成后立即销毁,因此保存其指针并后续访问属于严重的非法操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:22:40