2009-08-07 50 views

回答

36

是的。在任何特定的範圍內,本地對象都按照它們構建的相反順序銷燬。

11

是的,析構函數以相反的構造順序調用。

11

加上尼爾的答案。

考慮一下,如果情況正好相反,那就是你無法預測棧聲明變量的析構函數的順序。這將使得在棧上使用依賴值類型幾乎是不可能的。考慮

void Foo() { 
    Type1 t1; 
    Type2 t2(&t1); 
    ... 
} 

如果C++不保證析構函數排序,像這樣直接的代碼將是令人難以置信的不安全的,因爲這將有可能爲前T2的析構函數跑到被破壞T1。因此,你不能保證t2的析構函數運行一個有效的t1值。

+0

很棒的回答。我有一些依賴析構函數調用順序的代碼,我一直在尋找一個堅實的理由,爲什麼他們總是以一種特定的方式訂購,然後才相信我的代碼是正確的。 – 2017-04-10 20:15:02

3

的問題已經回答了,但我想補充一點,我通常都寫這樣的習慣:

void PerformLogin() 
{ 
    ScopeLock <Lock> LoginLock(&m_LoginLock); 
    doLoginCommand(); 

    { 
     ScopeLock <SharedMemoryBase> MemoryLock(&m_SharedMemory); 
     doStoreLogin(); 
     ... 
    } 
} 

在我看來,這使得意圖更清晰(*)。這可能是相關的,如果你的代碼真的是依賴在特定的順序。我發現這使得不太可能有人不小心改變了訂單,並導致一個難以發現的錯誤。 (嗯,這當然是不成問題的,因爲我們都已經制定的測試,不是嗎?)

我總是寫冗餘括號中像  (a && b) || c  過了,我覺得這件事情很類似。

(*):當然,您也可以使用評論。

0

是的,析構函數是構造函數的反轉。由於析構函數用於刪除不再需要的對象,並使用構造函數來創建對象。

相關問題