父对象和子对象生命周期独立,仅当子对象为父类成员变量时才随父对象析构自动销毁;堆上new的指针成员需显式delete或用智能指针管理;继承关系中子类非独立对象,而是同一对象的扩展部分。

不会自动一起销毁——父对象和子对象的生命周期完全独立,除非子对象是父对象的成员变量或通过 RAII 管理。
子对象是父类的成员变量时,会随父对象析构而自动销毁
这是最常见也最安全的情形。C++ 保证:当父类对象(如 Base)被销毁时,其所有非静态成员变量(包括子对象,如 Derived 类型的成员)按声明逆序调用析构函数。
- 构造顺序:先调用成员变量的构造函数,再执行父类构造函数体
- 析构顺序:先执行父类析构函数体,再按逆序调用各成员的析构函数
- 关键点:
Derived成员不是“子类实例”,而是“嵌入的独立对象”,它的生命周期被严格绑定在父对象的内存生命周期内
子对象是堆上 new 出来的指针成员时,不会自动销毁
如果父类中只存了一个 Derived* 指针(比如 Derived* p = new Derived;),那么父对象析构时,p 本身会被销毁,但 Derived 对象仍驻留在堆上,成为悬空资源。
- 必须在父类析构函数中显式写
delete p;(且p非空) - 更推荐用智能指针替代裸指针:
std::unique_ptr<derived> p;</derived>—— 析构时自动释放 - 若父类指针类型是
Base*并指向Derived对象,则基类析构函数必须为virtual ~Base(),否则Derived部分不会析构
父类和子类继承关系中的“子对象”不是独立对象,不适用“销毁”概念
这里容易混淆术语:“子类”(Derived)并不是一个被“包含”的子对象,而是父类对象内存布局的扩展部分。整个对象是一个单一实体,只是逻辑上分层。
- 创建
Derived d;时,只构造一个对象,它同时是Base和Derived - 销毁时,先调用
Derived::~Derived(),再调用Base::~Base()—— 这是同一个对象的两段清理逻辑,不是两个对象的销毁 - 不存在“父对象销毁、子对象还活着”的情况;也不存在“子对象销毁、父对象还留着”的情况
真正需要警惕的是:把“继承”误当成“组合”,又没处理好资源所有权。裸指针、非虚析构、忘记 delete 或智能指针未覆盖全部路径,才是实际 crash 和泄漏的根源。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











