首页 > 代码库 > 虚析构函数

虚析构函数

将析构函数设置为虚函数,是一般的基类的做法。但是这个做法存在一些问题,比如我们可能没有主动的申请堆上空间的操作,那么虚函数的存在,反而增加了维护虚表的负担,因此增加了开销,影响了性能(具体的影响,我还没有分析)。

另一方面,在实际应用中,即使存在new甚至malloc这样的申请空间的做法,虚析构函数,在某些情景下也不一定是必要的。

 

 1 #include <iostream> 2 using namespace std; 3  4 class base 5 { 6 public: 7     base() 8     { 9         cout<<"base ctor"<<endl;10     }11 /*    virtual ~base()12     {13         cout<<"base dtor"<<endl;14     }*/15     ~base()16     {17         cout<<"base dtor non-virtual"<<endl;18     }19     virtual void DoSome()20     {21         cout<<"base::DoSome"<<endl;22     }23 };24 25 class deri:public base26 {27 public:28     deri()29     {30         cout<<"deri ctor"<<endl;31     }32 /*    virtual ~deri()33     {34         cout<<"deri dtor"<<endl;35     }*/36     ~deri()37     {38         cout<<"deri dtor non-virtual"<<endl;39     }40     virtual void DoSome()41     {42         cout<<"deri::DoSome"<<endl;43     }44 };45 46 int main(void)47 {48     base* pb = new deri();49     delete pb;50 51     deri newd;52     return 0;53 }

这一段代码的运行结果是

 

1 neo-rMBP:hereit neo$ g++ -o test virtualdelete.cpp 2 neo-rMBP:hereit neo$ ./test 3 base ctor4 deri ctor5 base dtor non-virtual6 base ctor7 deri ctor8 deri dtor non-virtual9 base dtor non-virtual

我们可以看到,在通过基类指针来访问一个派生类实例的时候,如果没有使用虚析构函数,那么发生了“部分析构”的现象,也就造成了内存泄露。但是,如果我们使用传统的方式来产生一个实例,并且使用的话,那么可以看到,析构函数是可以正常的调用的。

 

虚析构函数