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

C++ C+;中的placement new执行的操作的完整列表是什么+;?,c++,constructor,new-operator,C++,Constructor,New Operator,讨论了在编译器不支持new和placement new时创建工厂方法的步骤。显然,如果placement new所完成的所有必要步骤都以某种方式重现,那么可以使用malloc()精心编制一些合适的解决方案 新的工作是什么?我会尽量列出,希望不要错过任何东西,除了以下内容 递归调用所有基类的构造函数 调用所有成员变量的构造函数和初始值设定项(如果有) 相应地设置vtable指针 还有哪些其他操作?Placementnew执行常规new所能执行的所有操作,但分配内存除外 我认为你基本上已经搞定了

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

新的工作是什么?我会尽量列出,希望不要错过任何东西,除了以下内容

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

还有哪些其他操作?

Placement
new
执行常规
new
所能执行的所有操作,但分配内存除外

我认为你基本上已经搞定了发生的事情,只是做了一些小的澄清:

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

  • 声明顺序中的虚拟基类
  • 按声明顺序的非虚拟基类
  • 按声明顺序排列的类成员
  • 类构造函数本身
  • 相应地设置vtable指针

    这一部分几乎完全是实现定义的。您的编译器可能不使用vtables。可能有多个vtable指针,或者一个或多个指向非vtable对象的指针。多重继承总是有趣的,虚拟基类也是如此。此元数据不保证可通过
    memcpy
    复制到另一个对象,因此指针不必是绝对的。其中可能有相对于对象指针本身的偏移量

    IIRC通常发生的情况是调用基类构造函数,然后将vtable指针设置为基类,然后调用第一个派生类构造函数,等等。这是为了满足规范中有关在构造函数中调用虚函数时发生的情况的要求。据我记忆所及,标准中没有“操作列表”,只有一个定义的初始化顺序


    <> P>所以不可能概括实现的方式,特别是因为你所拥有的不是C++标准的实现。如果它省去了“new”这个词,这大概是有充分理由的,因为它认为你不应该在目标平台上使用它,那么谁知道它忽略了该语言的哪些其他规则呢。如果可以用malloc和一点指针推动来模拟“new”,那么编译器究竟为什么不只是实现new呢?我认为您需要提出带有特定编译器和平台标签的问题,以便编译器上的任何专家都可以回答。

    @laalto answer通常是正确的。然而,有一个例外证明了这一规则

    vtable指针作为构造函数调用的一部分初始化,而不是单独初始化

    微软C++编译器知道所谓的本地VFABLE,即VFABLE是DLL本地的,并且将为每个导入类克隆。这是因为编译器想要提供一个修改过的析构函数来包装原始析构函数(s.a.)

    无论何时构造导入类的对象,编译器都会生成代码,在构造函数调用后,该代码将用本地指针覆盖原始vftable指针。此代码也出现在新调用中

    除了上面的帖子中提到的,还有另外一个解决方法。此解决方法不会强制您更改原始头文件。请看这里: