c++中,如果沒有為一個類提供析構函數,那麼編譯器會為這個類提供默認的析構的函數。由於析構函數的功能和構造函數相反,因此和默認的構造函數類似,編譯器也會提供無用的默認的析構函數,和非無用的析構函數。兩者的分析情況一樣(對於默認的構造函數分析,請參看《從匯編看c++中默認構造函數的使用分析》)。並且編譯器會提供非無用的默認析構函數情形和默認構造函數類似:
1 類含有虛成員函數(類繼承自虛基類或者繼承的基類含有虛成員函數,也屬於這種情況)
2 類繼承自一個基類,基類含有自定義析構函數(如果基類沒有自定義析構函數,但是編譯器會為它提供一個非無用的默認析構函數,也屬於這種情況。這就是說,只要基類含有一個析構函數,不管這個析構函數是自定義的,還是編譯器提供的非無用的默認析構函數,都行)
3 類包含一個成員對象,該成員對象自定義析構函數(如果成員對象沒有自定義析構函數,但是編譯器會為它提供一個非無用的默認析構函數,也屬於這種情況。這就是說,只要成員變量含有一個析構函數,不管這個析構函數是自定義的,還是編譯器提供的非無用的默認析構函數,都行).
並且,對於編譯器提供的默認析構函數,不管是無用的,還是非無用的,它們都不會自動清除對象裡面所包含的資源。