标签:style blog color io os 使用 sp div 问题
将析构函数设置为虚函数,是一般的基类的做法。但是这个做法存在一些问题,比如我们可能没有主动的申请堆上空间的操作,那么虚函数的存在,反而增加了维护虚表的负担,因此增加了开销,影响了性能(具体的影响,我还没有分析)。
另一方面,在实际应用中,即使存在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
我们可以看到,在通过基类指针来访问一个派生类实例的时候,如果没有使用虚析构函数,那么发生了“部分析构”的现象,也就造成了内存泄露。但是,如果我们使用传统的方式来产生一个实例,并且使用的话,那么可以看到,析构函数是可以正常的调用的。
标签:style blog color io os 使用 sp div 问题
原文地址:http://www.cnblogs.com/warnet/p/4019743.html