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


  • 相关阅读:
    前端 jquery获取当前页面的URL信息
    PHP合并数组及去重,PHP检测一个数组中有几个相同的
    ThinkPHP缓存技术(S(),F(),查询缓存,静态缓存)
    php 检测url
    ThinkPHP函数详解:F方法
    图片查看器(图片放大缩小功能)
    Thinkphp路由配置和静态缓存规则【原创】
    mySQL-CRUD操作(数据库的增删改查)练习题
    mySQL CRUD操作(数据库的增删改查)
    初识mySQL(关系型数据库)
  • 原文地址:https://www.cnblogs.com/lidan/p/2239486.html
Copyright © 2011-2022 走看看