zoukankan      html  css  js  c++  java
  • C++中虚析构函数的作用

    C++中的虚析构函数到底什么时候有用的,什么作用呢。

    总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的,而防止内存泄露的。

    两段代码:

    #include <iostream>
    
    using namespace std;
    
    class Base
    {
    public:
        Base(){}
        ~Base()
        {
            cout << "Base Destructor." << endl;
        }
    private:
        int a, b;
    };
    
    class Derive : public Base
    {
    public:
        Derive()
        {
            
        }
        ~Derive()
        {
            cout << "Derive Destructor." << endl;
            // release memeory
            if(pI != NULL)
            {
                delete pI;
            }
        }
    private:
        int *pI;
    };
    
    int main(void)
    {
        {
            Base *pD = new Derive;
            delete pD;
        }
        int i;
        cin >> i;
    
        return 0;
    }

    运行结果:

    这段代码中没有使用虚析构函数,当删除动态申请的对象时,只执行了基类的构造函数,而此时,子类里面是有动态申请的内存的,那么这就早成了内存的泄露。

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 class Base
     6 {
     7 public:
     8     Base(){}
     9     virtual ~Base()
    10     {
    11         cout << "Base Destructor." << endl;
    12     }
    13 private:
    14     int a, b;
    15 };
    16 
    17 class Derive : public Base
    18 {
    19 public:
    20     Derive()
    21     {
    22         pI = new int;
    23     }
    24     ~Derive()
    25     {
    26         cout << "Derive Destructor." << endl;
    27         // release memeory
    28         if(pI != NULL)
    29         {
    30             delete pI;
    31         }
    32     }
    33 private:
    34     int *pI;
    35 };
    36 
    37 int main(void)
    38 {
    39     {
    40         Base *pD = new Derive;
    41         delete pD;
    42     }
    43     int i;
    44     cin >> i;
    45 
    46     return 0;
    47 }

    运行结果:

    从运行结果可以看到,这次执行了基类的析构函数,那么就不会造成内存泄露了。

    我的疑问:使用基类指针来操作子类对象实现了多态。也就说虚函数和指针组合实现了C++的多态性。但是那是子类函数与基类函数同名实现了重写基类函数。而析构函数又不同名,难道也可以实现重写么?

    是不是因为每个类的析构函数只有一个,所以,C++内部对于析构函数做了特殊的处理,实现了所谓的重写。

    多态的实现是通过调用函数来实现的,但是delete是操作符,也可以么?也就说操作符操作基类指针,也会根据指针指向的实际对象来调用相应的函数么?

  • 相关阅读:
    Oracle冷备份需要保存的文件
    oracle 重建 sys密码文件
    ORA-01991错误
    oracle ORA-01033问题怎么解决
    oracle创建表空间
    oracle 10G服务器端安装以及冷备份恢复
    完全卸载oracle11g步骤
    42. 函数指针用在菜单驱动系统中,练习函数指针数组的使用。
    41. 定义与调用一个函数指针时的几种方式
    40. 使用数组时的四个要点
  • 原文地址:https://www.cnblogs.com/lit10050528/p/3874703.html
Copyright © 2011-2022 走看看