對C 析構函式的簡單理解

2021-09-09 09:23:33 字數 1151 閱讀 5162

被同學問到這樣乙個問題:

下面這段程式執行的時候,沒有執行析構函式?

class test

}

int main()

問題出在system(pause)這裡。

在c++中如果定義了物件,並且物件中定義了變數等,那麼程式執行的時候就會給它分配記憶體,如果不手動銷毀的話,物件會一直存在的,這些記憶體會一直被占用,這是乙個很嚴重的問題。

之前的方法是在每乙個class中都定義乙個free函式,在free函式中執行釋放記憶體的命令。

class test

void free()

};

這種方法有個很明顯的缺點, 必須手動銷毀,也就是說程式設計師必須自己判斷變數什麼時候不用了,然後手動銷毀。所以如果程式設計師判斷錯了,或者忘了銷毀,同樣會出問題。

c++ 11標準之後,有乙個新的處理方法:析構函式。可以理解為:析構函式是與建構函式功能相反的,析構函式專門用於清理記憶體。

析構函式的定義:~classname()

析構函式沒有引數,沒有返回值

析構函式是程式自動呼叫的,不需要手動呼叫

析構函式是物件釋放系統資源的保障

當類中定義了建構函式,並且建構函式中使用了系統資源,則需要自定義析構函式

析構函式是在物件銷毀的時候自動呼叫的,如果物件還在使用中,程式是不會呼叫析構函式的。

class test

}

int main()

在初學c++的時候,為了能夠看到程式的執行結果,防止出現一閃而過的情況,會在主程式中加上system(pause),但是這個時候,程式執行到這裡就不會繼續往下執行了,而這時,物件b還在使用中,所以這個時候是沒有釋放b的記憶體的,當然也就不會進入析構函式:~test()

在初學的時候,為了能夠觀察到真的進入了析構函式,可以使用其他的方法來保持控制台命令視窗,但是必須要執行到return 0。其中乙個方法就是進入除錯程式,在return 0的這句話前面加上斷點,這樣程式執行到了這裡,但是還沒有退出,所以可以觀察到析構函式的執行。

C 多型特性中對析構函式的理解

要使用多型特性時,基類析構函式需要加上virtual關鍵字,呼叫對基類指標的delete時才會發生動態繫結,使派生類的析構函式也能夠被呼叫到,否則只呼叫的基類的析構函式,沒有呼叫派生類的析構函式,導致記憶體洩漏。基類析構函式宣告virtual不是必需的,若確定不需要使用到基類指標指向派生類的多型特性...

C 對析構函式的誤解

析構函式在什麼時候會自動被呼叫,在什麼時候需要手動來呼叫,真不好意思說偶學過c 今日特此撥亂反正 物件在構造的時候系統會分配記憶體資源,對一些資料成員進行初始化或者賦值 乙個良好的class需要有資源 的機制,而這一操作便落在了析構函式的頭上,析構函式來負責類內的資源的free。來看一段 class...

C 析構函式 虛析構函式

1.為什麼要定義虛析構函式?如果有乙個帶有虛函式功能的類,則它需要乙個虛析構函式,原因如下 1 如果乙個類有虛函式功能,它經常作為乙個基類使用 2 如果它是乙個基類,它的派生類經常使用new來分配 3 如果乙個派生類物件使用new來分配,並且通過乙個指向它的基類的指標來控制,那麼它經常通過乙個指向它...