c++中,臨時物件一旦不需要,就會呼叫析構函式,釋放其占有的資源;而具名物件則是與建立的順序相反,依次呼叫析構函式。
c++原始碼:
classx 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++中的原始碼:
classx ~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 動態宣告的物件 這種宣告方式下系統會自動銷毀不再使用的物件,...