【问题标题】:POD class initialized with placement new default initialized?POD 类初始化放置新的默认初始化?
【发布时间】:2009-07-14 15:18:25
【问题描述】:

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

【问题讨论】:

  • 该文档已过时。在 '03 标准修订版中,new T(); 用于 POD 和没有用户声明的构造函数的非 POD 值初始化,而不是默认初始化。你会发现 C++ 中的初始化是一团糟。我希望 SO 有桌子支持
  • 呃...我明白你在说什么。我刚刚发现了这个错误:qc.embarcadero.com/wc/qcmain.aspx?d=51854 不过,我读的越多,它似乎越应该被零初始化..

标签: c++ placement-new


【解决方案1】:

从头开始:

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 类在您提供的内存中进行了初始化。内存是由操作系统分配的还是您提供了地址都没有关系。

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

【讨论】:

  • 谢谢!我在我的代码中观察到了这种行为,想知道它是否可以依赖,或者我的特定编译器/平台是否恰好发生了这种情况。为我清除了它,+1 :)
猜你喜欢
  • 2015-03-22
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 2014-12-29
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多