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

    在实现多态时候,基类的析构函数应该写成virtual。在用基类申明实例化的子类对象,在delete时候,如果基类不是virtual的析构函数则不能调用进子类的析构函数

    class Base{
    public:
        Base();
        virtual ~Base();
    public:
        char *m_pName;
    };
    
    Base::Base(){
         cout<<"Base()"<<endl;
        m_pName = new char[1024];
        memset(m_pName, 0, 1024);
    }
    
    Base::~Base(){
        cout<<"~Base()"<<endl;
        if (m_pName) {
            delete [] m_pName;
            m_pName = NULL;
        }
    }
    
    class Child:public Base{
    public:
        Child();
        ~Child();
    public:
        char *m_pAge;
    };
    
    Child::Child(){
        cout<<"Child()"<<endl;
        m_pAge = new char[2048];
        memset(m_pAge, 0, 2048);
    }
    Child::~Child(){
        cout<<"~Child()"<<endl;
        if (m_pAge) {
            delete [] m_pAge;
            m_pAge = NULL;
        }
    }
    
    int main(){
        Base *pBase = new Child();
        delete pBase;
    }
    
    输出如下:
    Base()
    Child()
    ~Base()
    
    这样导致内存泄漏,因为子类的析构函数没有被调用。
    修改这类问题,把基类析构函数声明为virtual.
    class Base{
    public:
        Base();
        virtual ~Base();
    public:
        char *m_pName;
    };
    
    输出:
    Base()
    Child()
    ~Child()
    ~Base()

    在没有virtual修饰下,是子类析构函数没有被调用。

  • 相关阅读:
    程序片段--2的乘方
    Set、Map集合、栈、队列
    Map迭代(六种)
    Struts2标签--控制标签
    线性表
    数据结构笔记(1)
    spingMVC问题小结
    《浪潮之巅》十四章笔记
    《浪潮之巅》十三章笔记
    《浪潮之巅》十二章笔记
  • 原文地址:https://www.cnblogs.com/zhidao-chen/p/3830174.html
Copyright © 2011-2022 走看看