如果我使用放置new初始化POD类,那么我能假设内存将被默认初始化(为零)吗?这个资源清楚地说明,如果您显式调用零参数默认构造函数,则字段将被默认初始化,但是如果使用放置new的默认实现(传递一个地址),则不清楚是否会保持这种情况。在这种情况下,内存被清零是标准行为吗?
从一开始:
5.3.4 / 15:
- 如果 new-initializer 的形式为
()
,则该项将进行值初始化(8.5);
8.5/5:
对于类型 T,进行值初始化的意思是:
如果 T 是一个类类型(第9条),并且具有用户声明的构造函数(12.1),那么将调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化不合法);
如果 T 是非联合类类型且没有用户声明的构造函数,则会对 T 的每个非静态数据成员和基类组件进行值初始化;
如果 T 是数组类型,则每个元素都会进行值初始化;
否则,对象将进行零初始化。
这里第一个符号不适用,因为你有一个 POD 类型,因此你不能有用户声明的构造函数。你的类型成员只能是 POD 类型,例如 int
、float
等,或者是一个嵌套的结构体,该结构体也是 POD 或者是一个 POD 类型的数组。因此,最终每个成员都得到了最后一个符号:"否则,对象将进行零初始化"。
这种初始化发生的原因是 POD 类在你提供的内存中初始化。这并不重要,无论内存是由操作系统分配的还是你提供的地址。
所以,在我看来,答案是肯定的——成员将被零初始化。
new T();
进行值初始化,而不是默认初始化。您会发现C ++中的初始化非常混乱。我希望SO能支持表格。 - Johannes Schaub - litb