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

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

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


第一,

  • 分配,你所询问的内存保留与初始化不同(并且在初始化之前执行一个构造函数,该构造函数基本上在该内存中设置合适的值),并且

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

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

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


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


    正如评论中提到的那样,它是基础类。 从逻辑上讲,由于您可以访问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;
    }
    
    链接地址: http://www.djcxy.com/p/21245.html

    上一篇: Memory allocation of base class and derived class constructor

    下一篇: How to return const Float** from a C++ function