C++ 析構函數執行順序

通過 Student 類依次創建了3個對象,分別是 stu1、stu2、stu3,但它們對應的析構函數的執行順序卻是相反的,這是爲什麼呢?

要搞清楚這個問題,首先要明白C++內存模型,也就是C++的代碼和數據在內存中是如何存儲的。

在內存模型中有一塊區域叫做棧區,它是由系統維護的(程序員無法操作),用來存儲函數的參數、局部變量等,類似於數據結構中的棧,也是先進後出。

當遇到函數調用時,首先將下一條指令的地址壓入棧區,然後將函數參數壓入棧區,隨着函數的執行,再將局部變量(或對象)按順序壓入棧區。

棧區是先進後出的結構,當函數執行結束後,先把最後壓入的變量(或對象)彈出,以此類推,最後把第一個壓入的變量彈出。接下來,再按照先進後出的規則彈出函數參數,彈出下一條指令地址。有了下一條指令的地址,函數調用結束後才能夠繼續執行後面的代碼。

所謂彈出變量,就是銷燬變量,清空變量所佔用的資源。如果這個變量是一個對象,那麼就會執行析構函數。

上節例子中,三個對象入棧的順序依次是 stu1、stu2、stu3,出棧(銷燬)的順序依次是 stu3、stu2、stu1,如下圖所示:


它們對應的析構函數的執行順序也就一目瞭然了。
main() 函數沒有參數,所以只有下一條指令的地址和局部變量入棧。
發佈了84 篇原創文章 · 獲贊 145 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章