c++ - C++ 中 placement new 执行的完整操作列表是什么?

标签 c++ constructor new-operator

this question讨论了在编译器不支持 new 和放置 new 时创建工厂方法。显然,如果通过放置 new 完成的所有必要步骤都以某种方式重现,则可以使用 malloc() 制作一些合适的解决方案。

放置有什么作用 - 我将尝试列出并希望不要遗漏任何内容 - 除了以下内容?

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

还有哪些 Action ?

最佳答案

Placement new 除了分配内存之外,它做了常规 new 会做的所有事情。

我认为您基本上已经确定了发生的事情,并做了一些小的说明:

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

构造/初始化顺序如下:

  1. 声明顺序中的虚基类
  2. 声明顺序中的非虚基类
  3. 按申报顺序类(class)成员
  4. 类构造函数本身

关于c++ - C++ 中 placement new 执行的完整操作列表是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1031543/

相关文章:

JavaScript:使用不带运算符的构造函数 'new'

c++ - 从抽象基类的多个部分实现继承?

c++ - 在多个 STL 对对象上创建迭代器

c++ - 为什么我不能使用 "delete"关键字回收动态分配的内存?

c++ - constrexpr 继承自 shared_ptr 的构造函数

php - Yii 和 PHP 初始化与构造问题

c++ - 二维数组中出现 "Too Many Initializer Values"错误

c++ - 在 C++ 中使用友元类和模板时出现超出范围错误

c++ - 警告 : base class ‘A’ should be explicitly initialized in the copy constructor

java - 为什么这些构造函数按这个顺序运行?