zoukankan      html  css  js  c++  java
  • C++中析构函数为什么要是虚函数

    //////////////////////////////////////////////////////
    //Example 1

    //////////////////////////////////////////////////////

    #include <iostream.h>

    class CFunction
    {
    public:
    CFunction()
    {
    data = new char[64];
    };
    ~CFunction()
    {
    delete [] data;
    };
    char *data;
    };

    class CFunctionEx : public CFunction
    {
    public:
    CFunctionEx()
    {
    m_data = new char[64];
    };
    ~CFunctionEx()
    {
    delete [] m_data;
    };
    private:
    char *m_data;
    };

    void main()
    {
    CFunction *pCFun = new CFunctionEx;
    delete pCFun;
    }
    你能看出什么问题吗?很显然,有内存泄漏。这是因为当删除pCFun时,它只调用了Cfunction的析构函数而没调用CfunctionEx的析构函数,所以导致内存泄漏。再看下例:
    //////////////////////////////////////////////////////
    //Example 2
    //////////////////////////////////////////////////////
    #include <iostream.h>
    class CBase
    {
    public:
    CBase()
    {
    data = new char[64];
    };
    ~CBase()
    {
    delete [] data;
    };
    char *data;
    };
    class CFunction
    {
    public:
    CFunction(){};
    ~CFunction(){};
    };
    class CFunctionEx : public CFunction
    {
    public:
    CFunctionEx(){};
    ~CFunctionEx(){};
    private:
    CBase m_cbase;
    };
    void main()
    {
    CFunction *pCFun = new CFunctionEx;
    delete pCFun;
    }
    你能看出什么问题吗?这里CfunctionEx和Cfunction中本身并没有分配内存,应该不会有内存泄漏。和上例一样当删除pCFun时,它只调用了Cfunction的析构函数而没调用CfunctionEx的析构函数,但CfunctionEx本身并没分配内存,是什么地方有内存泄漏我不说大家也应该知道了吧。不错是m_cbase,因为它是Cbase的实例且是CfunctionEx成员变量,当CfunctionEx的的析构函数没有被调用时,当然m_cbase的析构函数也没有被调用,所以Cbase中分配的内存被泄漏
    解决以上问题的方法很简单,就是使基类Cfunction的析构函数为虚函数就可以了


  • 相关阅读:
    2.NET Core设定数据库种子
    1.ASP.NET Core 中向 Razor Pages 应用添加模型
    获取文件夹目录下的文件信息
    dataGridView读写文本
    C# winform 启动外部程序
    netcore访问本地磁盘
    c#利用定时器自动备份数据库(mysql)
    c#mysql数据库备份还原
    Linux之旅(二)
    Linux之旅
  • 原文地址:https://www.cnblogs.com/lidan/p/2239486.html
Copyright © 2011-2022 走看看