C++对象析构函数解析示例

一、基类析构函数为虚函数

#include <iostream>

using namespace std;

class Point
{
public:
    Point(){
        cout << "Point()" << endl;
    }
    virtual ~Point(){
        cout << "~Point()" << endl;
    }

};

class Point3d : public Point
{
public:
    Point3d(){
        cout << "Point3d()" << endl;
    }
    ~Point3d(){
        cout << "~Point3d()" << endl;
    }

};

int main()
{
    Point *p = new Point;
    delete p;
    cout << "-------------------" << endl;
    Point *p3d = new Point3d;
    delete p3d;
    cout << "-------------------" << endl;

    Point3d *ps = new Point3d;
    delete ps;
    cout << "-------------------" << endl;

    Point *psa = new Point3d[2];
    delete psa;
    cout << "-------------------" << endl;

    Point *psb = new Point3d[2];
    delete []psb;
    cout << "-------------------" << endl;
    return 0;
}

执行结果:


上面代码的执行结果均符合我们正常的多态需要。


二、基类析构函数不是虚函数

代码为去掉上面代码中基类析构函数中前的 virtual,执行结果为:


这次,我们发现几个由基类指针指向的子类对象并没有正确调用析构函数,释放内存。这说明,delete 释放对象内存的时候,需要注意两个方面的问题:

1、如果基类有虚拟析构函数,则可以直接通过基类指针释放子类的内存;

2、如果基类没有虚拟析构函数,则需要将指向子类对象的指针强转为子类类型后,传递给delete;

3、在继承体系中,我们的析构函数只需管理本类新引入的动态内存,而不需要关心父类中的内存管理;


发布了29 篇原创文章 · 获赞 9 · 访问量 12万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章