2009-07-14 220 views
3

如果我初始化一个放置新的POD类,我可以假设内存将被默认初始化(为零)吗? This resource明确指出,如果显式调用零参数默认构造函数,将默认初始化这些字段,但不清楚这是否将使用placement new(传递地址)的默认实现保持true。在这种情况下是否将内存的标准行为归零?POD类初始化与安置新的默认初始化?

+0

该文件已过时。在'03标准修订版本中,`new T();`用于POD,非POD用户声明构造函数的值为初始化,而非默认初始化。你会发现在C++中初始化是一团糟。我希望SO会有桌面支持 – 2009-07-14 15:41:49

+0

呃......我明白你在说什么。我刚刚发现这个错误: http://qc.embarcadero.com/wc/qcmain.aspx?d=51854 虽然我读得越多,它似乎应该是零初始化越多.. – elecengin 2009-07-14 15:49:15

回答

3

从一开始:

5.3.4/15:

  • 如果新初始化是形式()的,则产品的值初始化(8.5);

8.5/5:

值初始化类型T的对象是指:

  • 如果T是一个类类型(第9节)与用户声明的构造函数(12.1),那么调用T的默认构造函数(并且如果T没有可访问的默认构造函数,则初始化不合格);如果T是一个没有用户声明构造函数的非联合类类型,那么T的每个非静态数据成员和基类组件都被初始化;

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

  • 否则,对象初始化为零

因为你有一个POD类型的第一颗子弹在这里并不适用,因此,你不能有一个用户声明的构造。您的类型的成员只能是POD类型,如int,float等,或者也是POD或POD类型的数组的嵌套结构。因此,最终每个人都会在最后的项目符号上结束:“否则,对象将被初始化为零”。

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

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