為什麼析構函式的執行順序是相反的。
要搞清楚這個問題,首先要明白c++記憶體模型,也就是c++的**和資料在記憶體中是如何儲存的。c++記憶體模型和c語言類似(有部分細節不同),你可以參照c語言記憶體模型來理解。
在記憶體模型中有一塊區域叫做棧區,它是由系統維護的(程式設計師無法操作),用來儲存函式的引數、區域性變數等,類似於資料結構中的棧,也是先進後出。
當遇到函式呼叫時,首先將下一條指令的位址壓入棧區,然後將函式引數壓入棧區,隨著函式的執行,再將區域性變數(或物件)按順序壓入棧區。
棧區是先進後出的結構,當函式執行結束後,先把最後壓入的變數(或物件)彈出,以此類推,最後把第乙個壓入的變數彈出。接下來,再按照先進後出的規則彈出函式引數,彈出下一條指令位址。有了下一條指令的位址,函式呼叫結束後才能夠繼續執行後面的**。
所謂彈出變數,就是銷毀變數,清空變數所占用的資源。如果這個變數是乙個物件,那麼就會執行析構函式。
上節例子中,三個物件入棧的順序依次是 stu1、stu2、stu3,出棧(銷毀)的順序依次是 stu3、stu2、stu1,如下圖所示:
它們對應的析構函式的執行順序也就一目了然了。
main() 函式沒有引數,所以只有下一條指令的位址和區域性變數入棧。
C 深入(記憶體模型)
為什麼有資料型別?現實生活中的資料太多而且大小形態不一。資料型別與記憶體的關係 資料型別的本質 建立變數的模具,是固定大小的別名。include stdio.h include stdlib.h include string.h int main 問題 b,b所代表的資料型別不一樣 b代表的是陣列首...
深入理解共享記憶體機制
共享記憶體可以說是最有用的程序間通訊方式,也是最快的ipc形式。是針對其他通訊機制執行效率較低而設計的。兩個不同程序a b共享記憶體的意思是,同一塊物理記憶體被對映到程序a b各自的程序位址空間。程序a可以即時看到程序b對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某...
理解JMM記憶體模型與深入Volatile關鍵字原理
一段 如下,執行緒a和執行緒b共享變數initflag。執行緒b先執行,執行緒a後執行。隨後執行緒a將initflag變為true,儲存這個操作後主記憶體中的initflag也會變為true。但是執行緒b不知道initflag已經被改變了,執行緒b會一直執行不會停下。public class vol...