C++之虚析构函数

来源:互联网 发布:网络言论自由的优点 编辑:程序博客网 时间:2024/06/08 04:39

先给个例子:

class Animal{public:    Animal();    ~Animal();    virtual void voice() = 0;};Animal::Animal(){    cout << "Animal()" << endl;}Animal::~Animal(){    cout << "~Animal()" << endl;}class Dog:public Animal{public:    Dog();    ~Dog();    virtual void voice();};Dog::Dog(){    cout << "Dog()" << endl;}Dog::~Dog(){    cout << "~Dog()" << endl;}void Dog::voice(){    cout << "I am a dog: wang wang wang wang" << endl;}class Cat:public Animal{public:    Cat();    ~Cat();    virtual void voice();};Cat::Cat(){    cout << "Cat()" << endl;}Cat::~Cat(){    cout << "~Cat()" << endl;}void Cat::voice(){    cout << "I am a cat: miao miao miao" << endl;}int main(){    Animal *ani = new Dog;    ani->voice();    delete ani;    ani = new Cat;    ani->voice();    delete ani;    system("pause");    return 0;}

输出结果为:

这里写图片描述

这里是在堆上创建的对象,delete了ani,发现结果中只有Dog和Cat的构造,却没有Dog和Cat的析构,而只析构了Animal,这就会发生内存泄漏。

解决的办法就是对基类Animal的析构函数变成虚函数,就会先调用子类的析构函数,然后再调用基类的析构函数,这样就形成了完全析构,避免了内存泄漏的问题,这里只需要在Animal的析构函数前面加个virtual即可:

class Animal{public:    Animal();    virtual ~Animal();     //虚析构函数    virtual void voice() = 0;};

输出结果:

这里写图片描述

0 0
原创粉丝点击