• 虚析构函数


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

    另一方面,在实际应用中,即使存在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

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

  • 相关阅读:
    C++编写ATM(2)
    【Python排序搜索基本算法】之Dijkstra算法
    Java中List转换为数组,数组转List
    [置顶] 亚信联创实习笔记
    PL/SQL 异常处理程序
    CSS position财产
    malloc()与calloc差异
    Qt5官方demo分析集10——Qt Quick Particles Examples
    栈和堆之间的差
    深入浅出JMS(一)——JMS简要
  • 原文地址:https://www.cnblogs.com/warnet/p/4019743.html
Copyright © 2020-2023  润新知