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)的析构函数,这样子,全部内存都被回收!

  • 相关阅读:
    HTTP状态码
    NSData NSDate NSString NSArray NSDictionary 相互转换
    NSDictionary to jsonString || 对象转json格式
    git 上传本地文件到github
    NSAssert用法
    深入理解GCD(一)
    ug-Assertion failure in [MyClass layoutSublayersOfLayer:]
    构建之法阅读笔记01
    学习进度
    四则运算程序
  • 原文地址:https://www.cnblogs.com/wiessharling/p/4783014.html
Copyright © 2011-2022 走看看