C 對析構函式的誤解

2021-09-07 23:41:06 字數 2091 閱讀 7896

析構函式在什麼時候會自動被呼叫,在什麼時候需要手動來呼叫,真不好意思說偶學過c++…今日特此撥亂反正

物件在構造的時候系統會分配記憶體資源,對一些資料成員進行初始化或者賦值;乙個良好的class需要有資源**的機制,而這一操作便落在了析構函式的頭上,析構函式來負責類內的資源的free。來看一段**:

class myclass

~myclass() };

int main()

執行結果:

在main主函式當中,如果直接宣告乙個物件,在宣告的時候,直接就呼叫了類內的建構函式,在主函式結束之前的那一小刻,也自動呼叫了這個類的析構函式;在看一段**:

int main()

執行結果:

在main主函式當中,如果直接宣告乙個物件指標(只是宣告而已),既不自動呼叫建構函式和析構函式。但是將main函式改為下面:

int main()

執行結果:

這裡不僅宣告了乙個物件指標,而且new了,這說明給這一物件指標分配乙個記憶體空間,當然這就會呼叫建構函式了;咦,奇怪了,為什麼不自動呼叫析構函式了,說明c++內部缺少這一機制,c++毫不客氣的對你說:「你提醒我給乙個物件分配空間,那也得麻煩你提醒我將它釋放(delete)。於是便有:

int main()

執行結果:

所以如果是指標在new之後需要手動釋放資源。在較大型的工程當中,資源的釋放很重要,因為涉及的資料量比較多,稍有不慎,就會造成資源的浪費和洩露之類的問題,從現在起你就應該養成把握資源的好習慣。

條款20:寧以pass-by-reference-to-const替換pass-by-value。——scott meyers

為什麼要在這裡說在函式當中使用「常引用」,固然它跟析構函式有很大的牽連。

class myclass

~myclass() };

void function(myclass mc)

int main()

執行結果:

結果很明朗,function函式內對myclass類的物件mc作了一次複製(淺複製而已)而造出了另乙個物件,也就是函式內的物件副本;呼叫函式的時候,如果選擇是傳值呼叫,那麼會有引數副本被複製到函式的棧區。

因為這裡呼叫的myclass類預設的copy建構函式,而不是呼叫上面myclass類的建構函式,但我們都明白,無論是哪種,都了構造,都是需要花費時間的,先不管時間有多短;遇上析構函式那是必然的。再者,如果myclass類有n個父類,而它的父類又有幾個引數需要構造析構,最後還需要層層析構(virtual析構函式《c++虛函式和純虛函式(1)》)......那這個花費的時間可就不能四捨五入啦。

解決方法就是寧以pass-by-reference-to-const替換pass-by-value。我們這樣:

class myclass

~myclass() };

void function(const myclass &mc)

int main()

結果讓我們大吃一驚:

這就是我們想要,而如果你怕function函式內會對mc做一些非法的事情,const可以把他拒之門外。太帥了,實在是太帥了。

搗亂小子 2011-12-09(更新)

C 析構函式 虛析構函式

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

對C 析構函式的簡單理解

被同學問到這樣乙個問題 下面這段程式執行的時候,沒有執行析構函式?class test int main 問題出在system pause 這裡。在c 中如果定義了物件,並且物件中定義了變數等,那麼程式執行的時候就會給它分配記憶體,如果不手動銷毀的話,物件會一直存在的,這些記憶體會一直被占用,這是乙...

C 析構函式和虛析構函式。

析構函式如果不是虛的話,基類的析構函式將不會被呼叫。多型時,也就是派生類被基類指標所指,或者被基類別名 虛析構函式,被呼叫時,其自身的析構函式和基類的析構函式都將會被呼叫。非虛的時候,不進行多型,只有基類的會被呼叫。純虛析構函式 定義的時候除了加 0 還需要給出函式的實現。因為當遞迴的呼叫析構函式時...