基类和派生类构造函数的内存分配

时间:2012-08-22 00:20:00

标签: c++ inheritance space

创建派生类对象时,首先为哪一个空间分配空间?

是基类构造函数还是派生类构造函数?

3 个答案:

答案 0 :(得分:5)

首先,

  • 分配,您要询问的内存预留与初始化不同(执行基本上设置合适值的构造函数)那个记忆),和

  • 正式(我们的神圣标准)和实践中对于大多数派生对象的内存是否需要连续,其中正式定义“内存区域”为可能是非连续的,主要是为了支持多个虚拟继承。

也就是说,在实践中,大多数派生对象是单个连续的内存块,包括所有基类子对象和数据成员子对象的空间,并且此块必须已分配一下子。

初始化(构造函数的调用)在分配后继续。如果通过抛出异常导致初始化失败,new表达式可以保证解除分配。但是,如果所采用的分配函数具有额外的自定义参数(所谓的“放置新的”)并且没有相应的释放函数可用,则该保证无效,例如,例如在Microsoft的MFC类框架的早期版本中进行调试构建(这很讽刺:初始化失败的程序只会在调试版本中泄漏内存...)。

答案 1 :(得分:1)

派生对象的空间包含所有派生成员和所有基本成员。派生对象只有一个分配,分配的内存保存对象的所有部分。

答案 2 :(得分:-1)

如评论中所述,它是Base类。从逻辑上讲,由于您可以访问Derived类(包括构造函数)中的基本公共成员和受保护成员,因此需要先分配它。尝试从以下代码开始并玩游戏。

#include <iostream>

class Base
{
    public:
    Base() {std::cout<<"Base CTOR" << std::endl;}
};

class Derived : public Base
{
    public:
    Derived():Base() {std::cout<<"Derived CTOR"<<std::endl;}
};

int main(int argc, char* argv[])
{
    Derived d;
}