zoukankan      html  css  js  c++  java
  • 虚析构函数

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

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

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

  • 相关阅读:
    MVVMLight leaning note
    c# Random Class usage
    Learning note for Binding and validation
    Content Template & DataTemplate 区别
    ListBox mvvm 学习笔记
    spinlock自旋锁de使用
    linux 内核(驱动)常用函数
    linux 编译,链接和加载
    Linux 下多核CPU知识
    linux 内核调试
  • 原文地址:https://www.cnblogs.com/warnet/p/4019743.html
Copyright © 2011-2022 走看看