POD类初始化为放置新默认值初始化?

时间:2009-07-14 15:18:25

标签: c++ pod placement-new

如果我使用placement new初始化POD类,我可以假设内存将默认初始化(为零)吗? This resource明确指出如果你明确地调用零参数默认构造函数,那么这些字段将被默认初始化,但是不清楚这是否会使用placement new的默认实现(传递地址)。在这种情况下,存储器的标准行为是否归零?

1 个答案:

答案 0 :(得分:4)

从一开始:

5.3.4 / 15:

  
      
  • 如果 new-initializer 的格式为(),则该项目已初始化值(8.5);
  •   

8.5 / 5:

  

值初始化 T类型的对象意味着:

     
      
  • 如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的)

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

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

  •   
  • 否则,该对象为零初始化

  •   

第一个项目符号不适用于此处,因为您有一个POD类型,因此您不能拥有用户声明的构造函数。您的类型的成员只能是POD类型,例如intfloat等,或者是嵌套结构,也是POD或POD类型的数组。所以最终他们每个人都会在最后的子弹中结束:“否则,对象是零初始化的。”

发生此初始化是因为POD类在您提供的内存中初始化。内存是由操作系统分配的,或者是否提供了地址无关紧要。

所以,恕我直言,答案是肯定的 - 会员将初始化为零。