首頁  >  問答  >  主體

c++ - 虚析构函数的内容一定要为空吗?

c++primer:

一个基类总是需要析构函数,而且它能将析构函数设定为虚函数。此时,该析构函数为了成为虚函数而令内容为空。

也就是说虚析构函数一定是这样的形式喽?

virtual ~Deconst()=default;

难道就不能有{ }包围的函数体吗?

PHPzPHPz2765 天前682

全部回覆(3)我來回復

  • PHP中文网

    PHP中文网2017-04-17 13:10:43

    樓上的說的比較清楚了,default會讓編譯器為你加上一個{}。
    如果你的這個類別持有了一些資源,虛析構函數也不應當為空,
    需要做一些清理工作。例如:

    class A{
    public:
        virtual ~A(){
            free(handle);
            delete ptr;
        }
        
        someFilehandle* handle;
        somePointer* ptr;   
    };
    

    如果A是作為一個父類,那麼它的析構函數盡量聲明為virtual以避免
    以下的情況出現:

    class B : public A {
    public:
        //some declaration
        virtual ~B() {}
    };
    
    //假使你获得了或者创建了一个A*类型的指向一个B*对象
    {
        A* a = new B();
        delete a;//如果A的构造函数不是virtual,那么这个时候
                 //就是一个未定义行为,B的析构函数多半不会调用
                 //导致可能的资源/内存泄漏。
    }

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 13:10:43

    不能,你這裡明確定義了用預設析構函數作為你的析構函數,如果要自訂就不是default了

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 13:10:43

    =default不是為空, 而是使用預設行為, 還是呼叫會成員的析構函數, 這一點跟直接寫{}沒什麼本質區別.

    virtual ~Deconst()=default;
    virtual ~Deconst() {}

    回覆
    0
  • 取消回覆