1. 程式人生 > >對象的銷毀(十七)

對象的銷毀(十七)

C++ 析構函數

我們在平時的生活中,對象都是被初始化後才上市的,它被銷毀前會做一些清理工作。那麽在 C++ 中如何清理需要銷毀的對象呢?一般而言,需要銷毀的對象都應該做清理。解決方案是:為每個類都提高一個 public 的 free 函數,當對象不再需要時立即調用 free 函數進行清理。

回想下我們之前創建的數組類,也是這樣做的。但是這有個問題:free 只是一個普通的函數,必須顯示的調用。對象銷毀前沒有做清理,便很可能造成資源泄露。那麽 C++ 編譯器是否能夠自動調用某個特殊的函數進行對象的清理呢?在 C++ 的類中可以定義一個特殊的清理函數,這個特殊的清理函數叫做析構函數析構函數的功能與構造函數相反,它的定義為:~ClassName()。析構函數沒有參數也沒有返回值類型聲明,析構函數在對象銷毀時自動被調用

下來我們以代碼為例進行析構函數的使用說明

#include <stdio.h>

class Test
{
private:
    int mi;
public:
    Test(int i)
    {
        mi = i;
        
        printf("Test(): %d\n", mi);
    }
    ~Test()
    {
        printf("~Test(): %d\n", mi);
    }
};

int main()
{
    Test t1(1);
    
    Test* p = new Test(2);
    
    delete p;
    
    return 0;
}

編譯結果如下

技術分享圖片

我們在程序中沒有手動調用析構函數,但是它在 return 之前被自動調用了。我們由此可以優化之前寫的數組類。將 free 函數改為析構函數,便可以在 main 函數中去掉 a.free() 和 b.free() 函數了。

析構函數的定義準則:當類中自定義了構造函數,並且構造函數中使用了系統資源(如:內存申請,文件打開等),則需要自定義析構函數。通過對析構函數的學習,總結如下:1、析構函數是對象銷毀時進行清理的特殊函數;2、析構函數在對象銷毀時自動被調用;3、析構函數是對象釋放系統資源的保障。


歡迎大家一起來學習 C++ 語言,可以加我QQ:

243343083

對象的銷毀(十七)