在C++中使用placement new执行的操作的完整列表是什么?

sha*_*oth 7 c++ constructor new-operator

这个问题中,讨论了当编译器不支持new和placement new时创建工厂方法.显然,如果以的方式完成所有必要的步骤以某种方式再现,则可以使用malloc()来制作一些合适的解决方案.

放置新的做什么 - 我会尝试列出并希望不要错过任何东西 - 除了以下?

  • 以递归方式调用所有基类的构造函数
  • 为所有成员变量调用构造函数和初始值设定项(如果有)
  • 相应地设置vtable指针.

还有什么其他行动?

laa*_*lto 6

除了分配内存之外,Placement 会执行new常规new操作.

我认为你基本上已经把所发生的事情钉在了一些细微的说明上:

  • 显然,类本身的构造函数也被调用
  • vtable指针初始化为构造函数调用的一部分,而不是单独的.这意味着部分构造的对象(想想构造函数中抛出的异常)将其vtable设置为构造进行到的点.

构造/初始化的顺序如下:

  1. 声明顺序中的虚拟基类
  2. 声明顺序中的非虚基类
  3. 声明顺序中的类成员
  4. 类构造函数本身