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的析构函数为虚函数就可以了


  • 相关阅读:
    shell数组
    Apache HTTP Server 与 Tomcat 的三种连接方式介绍
    实现Java动态类载入机制
    Tomcat 阀
    MYSQL 常用命令
    MYSQL字符数字转换
    主题:MySQL数据库操作实战
    日本手机三大代理商的UA
    Java解析XML文档——dom解析xml (转载)
    MS sql server和mysql中update多条数据的例子
  • 原文地址:https://www.cnblogs.com/lidan/p/2239486.html
Copyright © 2011-2022 走看看