首页 > 代码库 > 虚析构函数
虚析构函数
将析构函数设置为虚函数,是一般的基类的做法。但是这个做法存在一些问题,比如我们可能没有主动的申请堆上空间的操作,那么虚函数的存在,反而增加了维护虚表的负担,因此增加了开销,影响了性能(具体的影响,我还没有分析)。
另一方面,在实际应用中,即使存在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
我们可以看到,在通过基类指针来访问一个派生类实例的时候,如果没有使用虚析构函数,那么发生了“部分析构”的现象,也就造成了内存泄露。但是,如果我们使用传统的方式来产生一个实例,并且使用的话,那么可以看到,析构函数是可以正常的调用的。
虚析构函数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。