代码:析构函数为非虚函数
#include <iostream> using namespace std; class A { public: A() { cout << "A" << endl; } ~A() { cout << "~A" << endl; } }; class B : public A{ public: B() { cout << "B" << endl; } ~B() { cout << "~B" << endl; } }; int main(int argc, char** argv) { A *pa = new B(); delete pa; B *pb = new B(); delete pb; }
输出:
A
B
~A
A
B
~B
~A
指向子类对象的基类指针,析构过程未调用子类的析构函数,若子类申请内存空间,则将无法被释放,导致内存泄漏。
代码:析构函数为虚函数
#include <iostream> using namespace std; class A { public: A() { cout << "A" << endl; } virtual ~A() { cout << "~A" << endl; } }; class B : public A{ public: B() { cout << "B" << endl; } virtual ~B() { cout << "~B" << endl; } }; int main(int argc, char** argv) { A *pa = new B(); delete pa; B *pb = new B(); delete pb; }
输出:
A
B
~B
~A
A
B
~B
~A
指向子类对象的基类指针,析构过程先调用子类析构函数,再调用基类析构函数。
若析构函数为非虚函数时,delete p 会直接调用相应指针类型的析构函数 即父类析构函数。若析构函数为虚函数时,则会调用实际对象的析构函数,即子类析构函数,子类继承自父类,子类析构函数调用完,会接着调用父类析构函数。
时间: 2024-10-08 03:16:28