C++對解構函式的誤解

來源:互聯網
上載者:User
C++析構前言

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

 

C++析構誤解本文

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

class myclass{public:myclass(){cout << "建構函式" << endl;}~myclass(){cout << "解構函式" << endl;}};int main(){myclass mc;return 0;}

執行結果:

 

在main主函數當中,如果直接聲明一個對象,在聲明的時候,直接就調用了類內的建構函式,在主函數結束之前的那一小刻,也自動調用了這個類的解構函式;在看一段代碼:

int main(){myclass * mc;return 0;}

 執行結果:

 

在main主函數當中,如果直接聲明一個對象指標(只是聲明而已),既不自動調用建構函式和解構函式。但是將main函數改為下面:

int main(){myclass * mc;mc = new myclass();return 0;}

執行結果:

 

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

int main(){myclass * mc;mc = new myclass();delete mc;return 0;}

執行結果:

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

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

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

class myclass{public:myclass(){cout << "建構函式" << endl;}~myclass(){cout << "解構函式" << endl;}};void function(myclass mc){}int main(){myclass mc;function(mc);return 0;}

執行結果:

 

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

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

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

class myclass{public:myclass(){cout << "建構函式" << endl;}~myclass(){cout << "解構函式" << endl;}};void function(const myclass &mc){}int main(){myclass mc;function(mc);return 0;}

結果讓我們大吃一驚:

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.