Skip to content
On this page

CPP_析构函数


标签:CPP/面向对象  

析构函数

功能:对象消亡时,释放内存空间和其他善后工作

格式

  • 无返回值
  • 无参数
  • 默认 public
cpp
~Stu() { 函数体内容 }

调用时机

  • 栈区:对象生命周期结束,自动调用
  • 堆区:使用 delete 手动释放

默认析构函数

  • 没有显性定义析构函数的时候,默认提供一个析构函数
  • 如果显式定义了析构函数,系统不再提供默认析构函数
  • 没有指针成员对象的时候,默认的即可;当有指针对象的时候,需要显式定义,并在函数体内释放对应内存空间
  • 有继承关系时,需要显式定义析构函数,并定义成虚析构函数,否则基类的内存空间没法被释放
  • 默认调用的析构函数,按照栈区 FILO 的原则,后构造的先析构:即先调用派生类的析构函数,再调用基类的析构函数,示例
cpp
#include <iostream>
using namespace std;

class Base {
  public:
    Base() { cout << "基类构造函数被调用" << endl; }
    ~Base() { cout << "基类析构函数被调用" << endl; }
};

class Member {
  public:
    Member() { cout << "成员对象构造函数被调用" << endl; }
    ~Member() { cout << "成员对象析构函数被调用" << endl; }
};

class Derived: public Base {
  Member member;
  public:
    Derived(): member(Member()) { cout << "派生类构造函数被调用" << endl; }
    ~Derived() { cout << "派生类析构函数被调用" << endl; }
};

int main() {
  // 栈区
  // Derived d; 

  // 堆区
  Derived* d2 = new Derived();
  delete d2;
}
txt
基类构造函数被调用
成员对象构造函数被调用
派生类构造函数被调用
派生类析构函数被调用
成员对象析构函数被调用
基类析构函数被调用

Last updated: