程式執行析構函式的幾種情況

2021-04-21 15:16:31 字數 1170 閱讀 8553

①如果在乙個函式中定義了乙個物件(它是自動區域性物件),當這個函式被呼叫結束時,物件應該釋放,在物件釋放前自動執行析構函式。

②static區域性物件在函式呼叫結束時物件並不釋放,因此也不呼叫析構函式,只在main函式結束或呼叫exit函式結束程式時,才呼叫static區域性物件的析構函式。

③如果定義了乙個全域性物件,則在程式的流程離開其作用域時(如main函式結束或呼叫exit函式) 時,呼叫該全域性物件的析構函式。

④如果用new運算子動態地建立了乙個物件,當用delete運算子釋放該物件時,先呼叫該物件的析構函式。

析構函式的作用並不是刪除物件,而是在撤銷物件占用的記憶體之前完成一些清理工作,使這部分記憶體可以被程式分配給新物件使用。程式設計者事先設計好析構函式,以完成所需的功能,只要物件的生命期結束,程式就自動執行析構函式來完成這些工作。

析構函式不返回任何值,沒有函式型別,也沒有函式引數。因此它不能被過載。乙個類可以有多個建構函式,但只能有乙個析構函式。

實際上,析構函式的作用並不僅限於釋放資源方面,它還可以被用來執行「使用者希望在最後一次使用物件之後所執行的任何操作」,例如輸出有關的資訊。這裡說的使用者是指類的設計者,因為,析構函式是在宣告類的時候定義的。也就是說,析構函式可以完成類的設計者所指定的任何操作。

一般情況下,類的設計者應當在宣告類的同時定義析構函式,以指定如何完成「清理」的工作。如果使用者沒有定義析構函式,c++編譯系統會自動生成乙個析構函式,但它只是徒有析構函式的名稱和形式,實際上什麼操作都不進行。想讓析構函式完成任何工作,都必須在定義的析構函式中指定。

什麼時候呼叫建構函式和析構函式

(1) 在全域性範圍中定義的物件(即在所有函式之外定義的物件),它的建構函式在檔案中的所有函式(包括main函式)執行之前呼叫。但如果乙個程式中有多個檔案,而不同的檔案中都定義了全域性物件,則這些物件的建構函式的執行順序是不確定的。當main函式執行完畢或呼叫exit函式時(此時程式終止),呼叫析構函式。

(2) 如果定義的是區域性自動物件(例如在函式中定義物件),則在建立物件時呼叫其建構函式。如果函式被多次呼叫,則在每次建立物件時都要呼叫建構函式。在函式呼叫結束、物件釋放時先呼叫析構函式。

(3) 如果在函式中定義靜態(static)區域性物件,則只在程式第一次呼叫此函式建立物件時呼叫建構函式一次,在呼叫結束時物件並不釋放,因此也不呼叫析構函式,只在main函式結束或呼叫exit函式結束程式時,才呼叫析構函式。

關於fork函式執行的幾種情況

輸出6個 先看這段 1 2 3 4 5 6 7 8 9 10 11 12 13 intmain void wait null wait null return0 輸出8個 1.fork 系統呼叫是unix下以自身程序建立子程序的系統呼叫,一次呼叫,兩次返回,如果返回是0,則是子程序,如果返回值 0,...

關於建構函式和析構函式呼叫時的多種情況

例 有乙個類a當這樣定義時 class aa aa const aa a aa aa operator const aa a 其中函式如下,當呼叫test1時 aa f aa a void test1 執行結果如下 由此可見在這種情況下vs2013編譯器不會給予優化。2.有test2如下 void ...

析構函式的奧秘

class b class c public b private a a int main int argc,char argv 類c從類b中繼承出來,類c中聚合了乙個類a的物件,類c的析構函式並未呼叫類a的析構函式,請問 這段 執行後,會呼叫類a的析構函式釋放記憶體嗎?經測試,執行結果如下 con...