If I initialize a POD class with placement new, can I assume that the memory will be default initialized (to zeros)? This resource clearly states that if you call the zero argument default constructor explicitly that the fields will be default initialized, but it is not clear if this would hold true using the default implementation of placement new (passing an address). Is it standard behavior for the memory to be zeroed in this case?
问问题
1472 次
1 回答
3
从一开始就:
5.3.4/15:
- 如果new-initializer的形式为
()
,则该项为值初始化 (8.5);
8.5/5:
对T 类型的对象进行值初始化意味着:
如果 T 是具有用户声明的构造函数(12.1)的类类型(第 9 条),则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化是错误的);
如果 T 是没有用户声明的构造函数的非联合类类型,则 T 的每个非静态数据成员和基类组件都是值初始化的;
如果 T 是一个数组类型,那么每个元素都是值初始化的;
否则,对象被零初始化
第一个项目符号在这里不适用,因为你有一个 POD 类型,因此你不能有一个用户声明的构造函数。您的类型的成员只能是 POD 类型,例如int
,float
等,或者也是 POD 或 POD 类型数组的嵌套结构。所以最终他们每个人都在最后一个项目符号处结束:“否则,对象是零初始化的”。
发生这种初始化是因为 POD 类是在您提供的内存中初始化的。内存是由操作系统分配的还是您提供了地址都没有关系。
所以,恕我直言,答案是肯定的 - 成员将被零初始化。
于 2009-07-14T17:58:58.653 回答