使用放置new进行默认初始化的POD类被初始化了吗?

3
如果我使用放置new初始化POD类,那么我能假设内存将被默认初始化(为零)吗?这个资源清楚地说明,如果您显式调用零参数默认构造函数,则字段将被默认初始化,但是如果使用放置new的默认实现(传递一个地址),则不清楚是否会保持这种情况。在这种情况下,内存被清零是标准行为吗?

那份文档已经过时了。在'03标准修订版中,对于POD类型以及没有用户声明构造函数的非POD类型,new T();进行值初始化,而不是默认初始化。您会发现C ++中的初始化非常混乱。我希望SO能支持表格。 - Johannes Schaub - litb
啊...我明白你的意思了。我刚刚发现了这个 bug:http://qc.embarcadero.com/wc/qcmain.aspx?d=51854不过,我越读越觉得它应该被初始化为零。 - elecengin
1个回答

3

从一开始:

5.3.4 / 15:

  • 如果 new-initializer 的形式为 (),则该项将进行值初始化(8.5);

8.5/5:

对于类型 T,进行值初始化的意思是:

  • 如果 T 是一个类类型(第9条),并且具有用户声明的构造函数(12.1),那么将调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化不合法);

  • 如果 T 是非联合类类型且没有用户声明的构造函数,则会对 T 的每个非静态数据成员和基类组件进行值初始化;

  • 如果 T 是数组类型,则每个元素都会进行值初始化;

  • 否则,对象将进行零初始化。

这里第一个符号不适用,因为你有一个 POD 类型,因此你不能有用户声明的构造函数。你的类型成员只能是 POD 类型,例如 intfloat 等,或者是一个嵌套的结构体,该结构体也是 POD 或者是一个 POD 类型的数组。因此,最终每个成员都得到了最后一个符号:"否则,对象将进行零初始化"。

这种初始化发生的原因是 POD 类在你提供的内存中初始化。这并不重要,无论内存是由操作系统分配的还是你提供的地址。

所以,在我看来,答案是肯定的——成员将被零初始化。


谢谢!我在我的代码中观察到了这种行为,想知道它是否可以被依赖,或者是我的特定编译器/平台偶然发生了这种情况。你为我解决了疑惑,+1 :) - user21037

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接