zoukankan      html  css  js  c++  java
  • 什么时候需要将析构函数定义为虚函数,如果不这么做,会存在什么问题?

    这是网易游戏面我的一道题,当时想了一想,结果答错了,没在意,今天测试了一下,结果才认识到问题所在!

    直接看代码:

    class Interface {
    public:
        virtual void fun() = 0;
        Interface() {
            cout<<"Interface::Interface()"<<endl;
            _data = new char[10];
        }
        virtual ~Interface() {
            cout<<"Interface::~Interface()"<<endl;
            delete [] _data;
        }
    protected:
        char *_data;
    };
    
    class Implement: public Interface {
    public:
        void fun() {
            cout<<"This is Implement object."<<endl;
        }
    
        Implement() {
            cout<<"Implement::Implement()"<<endl;
            _ba = new char[10];
        }
    
        ~Implement() {
            cout<<"Implement::~Implement()"<<endl;
            delete []_ba;
        }
    private:
        int a;
        char *_ba;
    };

    下面,我们来分析一下问题所在:

    1)如果基类(Interface)的析构函数不为虚函数

    //内存泄露(子类析构函数没有被调用)
        Interface *base = new Implement();
        delete base;

    base则找不到子类的析构函数,因此,只调用了父类自身的析构函数,因此造成内存泄露;

    2)如果基类(Interface)的析构函数为虚函数,那么虚函数表就会多了一个函数指针,这个函数指针方便了base找到正确的析构函数(子类Implement析构函数),而子类的析构函数会自动调用基类(Interface)的析构函数,这样子,全部内存都被回收!

  • 相关阅读:
    jQuery.extend
    Topshelf便捷创建Windows服务
    cron表达式
    定时调度框架:Quartz.net
    sqlserver自定义函数
    HTML dom document 对象
    正则表达式之 数据验证 与 文本替换
    JavaScript 之 DOM 与 BOM
    CSS 之pseudo-classes 与pseudo-element的异同
    CSS中的 position与Grid Layout
  • 原文地址:https://www.cnblogs.com/wiessharling/p/4783014.html
Copyright © 2011-2022 走看看