虚析构函数

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

另一方面,在实际应用中,即使存在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 base
26 {
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 ctor
4 deri ctor
5 base dtor non-virtual
6 base ctor
7 deri ctor
8 deri dtor non-virtual
9 base dtor non-virtual

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

 

posted @ 2014-10-11 20:43  warnet  阅读(299)  评论(0编辑  收藏  举报