C++ 类中的std::list变量是否需要初始化?

C++ 类中的std::list变量是否需要初始化?,c++,initialization,C++,Initialization,我最近读过类似的文章。我知道事情没那么复杂。但是作为一个初学者,我只是不知道为什么它会起作用,下面是描述 包括 包括 使用名称空间std; 样板 甲级 { 公众: 列表测试列表; A. ~A; 无效m_附录*1; }; 样板 A::A { cout数据成员testlist在A的构造函数的成员初始值设定项列表中没有提到,并且自C++11以来没有默认的成员初始值设定项,那么它将通过std::list的默认构造函数 当构造函数初始值设定项列表中没有提到基类或非静态数据成员,并且调用了该构造函数时。 及

我最近读过类似的文章。我知道事情没那么复杂。但是作为一个初学者,我只是不知道为什么它会起作用,下面是描述

包括 包括 使用名称空间std; 样板 甲级 { 公众: 列表测试列表; A. ~A; 无效m_附录*1; }; 样板 A::A { cout数据成员testlist在A的构造函数的成员初始值设定项列表中没有提到,并且自C++11以来没有默认的成员初始值设定项,那么它将通过std::list的默认构造函数

当构造函数初始值设定项列表中没有提到基类或非静态数据成员,并且调用了该构造函数时。 及

不需要初始化此测试列表,或者


这取决于您的意图。如果默认初始化足够,则选择“是”。

要理解这一点,您必须知道列表是如何构造的。 它在堆栈上有一个控制块,然后在插入元素时在堆上分配元素。控制块由构造函数初始化

下面是一张图片,以了解这是什么样子:


因此,您不需要初始化列表。

问题更像是“为什么调用构造函数”,而不是“为什么默认构造的列表可以使用”。问题并不是关于std::list如何使用内存。更重要的是,在没有构造函数初始化器列表中的显式条目的情况下初始化列表,因为列表具有default构造函数。OP关注未初始化的变量,这是一件好事!ControlBlock适用于std::list类型中包含的大多数std实现。如果列表是在堆栈上创建的,则ControlBlock将位于堆栈上。但是该类型也可以在堆上初始化,然后它将位于堆。列表节点是在堆栈上分配还是在堆上分配取决于分配器,大多数std实现的默认分配器将分配堆上的元素。在许多情况下,使用术语堆栈和堆是不准确的,并且不是必需的。存储持续时间和生存期通常是更好的选择。只要std::list有一个定义T构造函数,它是这样做的,它将通过调用A::a作为空列表来初始化。顺便说一下,把原始指针放进列表中充满了陷阱。对于下一个迭代,也许考虑使用STD::UnQuyjpTR,或者STD::SyrdY-PTR,因为它们会为你清理整理。好的。谢谢你的建议。我去看看。
constructor
4 push in
4
5 push in
5
6 push in
6
destructor