结构 + initializer_list 的聚合初始化:新与静态

Aggregate initialization for structs + initializer_list: new vs static

本文关键字:初始化 静态 initializer list 结构      更新时间:2023-10-16

最近我调试了一些复杂结构的分配对象(未定义构造函数)的结果出现了奇怪的问题。结果,我检测到如果我有,例如:

struct A {
int                           b;
std::initializer_list<Type*>  c;
};

那么使用new和静态分配的这个struct A的对象 a 是不同的:

A a {1, {new Type(), new Type()}};做我想做的,但是

A* a = new A {1, {new Type(), new Type()}};c成员执行一些错误初始化。

这些情况是否因标准、编译器的不良行为或我的错误而有所不同C++?在VS2017上测试。

如果你阅读文档,你可以避免这样的问题:https://en.cppreference.com/w/cpp/utility/initializer_list。

在原始初始值设定项列表对象的生存期结束后,不保证基础数组存在。std::initializer_list 的存储未指定(即它可以是自动、临时或静态只读内存,具体取决于情况)。

因此,正如评论中的链接中所建议的那样,您应该将数据存储在永久容器中(此处std::vector可能是正确的选择)。