從彙編看c 中臨時物件的析構時機

2022-05-15 09:41:57 字數 1399 閱讀 8897

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

c++原始碼:

class

x x() {}

};int

main()

對應的彙編碼:

_main    proc

;11 : int main()

lea ecx, dword ptr _x2$[ebp];

獲取x2的首位址,作為隱含引數傳入析構函式

call ??1x@@qae@xz ;

為x2呼叫析構函式

lea ecx, dword ptr _x1$[ebp];

獲取x1的首位址,作為隱含引數傳入析構函式

call ??1x@@qae@xz ;

為x1呼叫析構函式

xoreax, eax

movesp, ebp

popebp

ret0

_main endp

從上面的彙編碼可以看出,臨時物件確實是在不需要之後就呼叫了析構函式,儘管它在x2物件之前被建立,但依然在x2物件之前被析構。而x1 x2析構函式呼叫順序,是與他們建構函式的呼叫順序相反。

再看下面的情況:

c++中的原始碼:

class

x ~x() {}

};int

main()

這裡,改造臨時物件之後,有乙個逗號表示式,而不是分號。

下面是彙編碼:

;

12 : int main()

lea ecx, dword ptr _x2$[ebp];

獲取x2的首位址,作為隱含引數傳遞給析構函式

call ??1x@@qae@xz ;

為x2呼叫析構函式

lea ecx, dword ptr _x1$[ebp];

獲取x1的首位址,作為隱含引數傳遞給析構函式

call ??1x@@qae@xz ;

為x1呼叫析構函式

xoreax, eax

movesp, ebp

popebp

ret0

_main endp

可以看到,與第一次不同的是,臨時物件構造完畢之後,並沒有立即呼叫析構函式,而是執行了逗號後面的賦值語句後,才呼叫的析構函式。

綜上所述:

臨時物件呼叫析構函式的時機是一條高階語言執行完畢的時候,而一條高階語言執行完畢的標誌是分號。所以,臨時物件呼叫析構函式的時機是碰到分號的時候

從彙編看c 中臨時物件的析構時機

c 中,臨時物件一旦不需要,就會呼叫析構函式,釋放其占有的資源 而具名物件則是與建立的順序相反,依次呼叫析構函式。c 原始碼 class x x int main 對應的彙編碼 main proc 11 int main lea ecx,dword ptr x2 ebp 獲取x2的首位址,作為隱含引...

從彙編看c 中引數物件和區域性物件的析構順序

下面是c 的原始碼 class x void f x x intmain 下面是main函式的彙編碼 main proc 15 int main xoreax,eax movesp,ebp popebp ret0 main endp 從上面可以看出,產生的臨時物件在函式呼叫完成退出後才呼叫析構函式。...

c 中析構函式呼叫時機的研究

眾所周知,c 中的每個類都會有乙個析構函式,當這個類的物件被銷毀的時候,物件會自動呼叫析構函式。那麼什麼情況下物件的析構函式會被自動呼叫呢?其實這個問題也可以換種方式問,什麼情況下物件會被自動銷毀。我們跟據物件的宣告方式分兩種情況來講 1 動態宣告的物件 這種宣告方式下系統會自動銷毀不再使用的物件,...