天天看點

從彙編看c++中臨時對象的析構時機

http://www.cnblogs.com/chaoguo1234/archive/2013/05/12/3074425.html

c++中,臨時對象一旦不需要,就會調用析構函數,釋放其占有的資源;而具名對象則是與建立的順序相反,依次調用析構函數。

c++源碼:

從彙編看c++中臨時對象的析構時機
從彙編看c++中臨時對象的析構時機

對應的彙編碼:

從彙編看c++中臨時對象的析構時機
從彙編看c++中臨時對象的析構時機

從上面的彙編碼可以看出,臨時對象确實是在不需要之後就調用了析構函數,盡管它在x2對象之前被建立,但依然在x2對象之前被析構。而x1 x2析構函數調用順序,是與他們構造函數的調用順序相反。

再看下面的情況:

c++中的源碼:

從彙編看c++中臨時對象的析構時機
從彙編看c++中臨時對象的析構時機

這裡,改造臨時對象之後,有一個逗号表達式,而不是分号。

下面是彙編碼:

從彙編看c++中臨時對象的析構時機
從彙編看c++中臨時對象的析構時機

可以看到,與第一次不同的是,臨時對象構造完畢之後,并沒有立即調用析構函數,而是執行了逗号後面的指派語句後,才調用的析構函數。

綜上所述:

臨時對象調用析構函數的時機是一條進階語言執行完畢的時候,而一條進階語言執行完畢的标志是分号。是以,臨時對象調用析構函數的時機是碰到分号的時候

------------------越是喧嚣的世界,越需要甯靜的思考------------------

合抱之木,生于毫末;九層之台,起于壘土;千裡之行,始于足下。

積土成山,風雨興焉;積水成淵,蛟龍生焉;積善成德,而神明自得,聖心備焉。故不積跬步,無以至千裡;不積小流,無以成江海。骐骥一躍,不能十步;驽馬十駕,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓無爪牙之利,筋骨之強,上食埃土,下飲黃泉,用心一也。蟹六跪而二螯,非蛇鳝之穴無可寄托者,用心躁也。

繼續閱讀