2015-07-11 27 views
1

我有一個unordered_map的對象。每個對象在其析構函數中瀏覽無序映射以查找其他對象,然後調整這些其他對象。如果其他對象是殭屍對象,這將失敗,但如果其他對象完全從unordered_map中移除,則沒有問題。unordered_map中的銷燬順序

我的問題:

  1. 這是否工作,如果我刪除()的對象,它的析構函數試圖尋找自己在無序的地圖嗎?具體來說,析構函數是第一個調用的,還是首先從unordered_map中移除了對象,還是沒有保證?
  2. 這個工作,如果unordered_map被銷燬?具體來說,當每個單獨的析構函數被調用時,unordered_map是否處於有效狀態?
+5

只是不這樣做? –

+1

只需用一些打印語句進行測試吧? –

+1

擦除只會使其自己的迭代器無效,但我認爲一旦析構函數被調用,您就可以認爲您可以在映射中找到自己。另外不要認爲如果你測試並且它在一個實現中起作用,它將與標準庫的其他實現一起工作。正如@KerrekSB所說 - 不要這樣做 –

回答

3

類型T的對象的生存期結束時[...]如果T是具有一個非平凡的析構函數(12.4),析構函數呼叫開始一個類的類型[...]

[§3.8/1 N4431]

,並且進一步向下

在整個本國際標準歸因於對象的屬性適用給定對象只杜響其壽命

[§3.8/3 N4431]

最後

[...]的對象的生命週期結束之後[...]任何指針指到物體將存在或存在的存儲位置可以被使用,但只能以有限的方式使用。 [...]如果指針用於訪問非靜態數據成員或調用對象的非靜態成員函數[...],則該程序具有未定義的行爲[...]

[§] 3.8/5 N4431]

所以,因爲你必須有某種引用(例如指針,或者一個真正的參考,我想在這裏算作指針,太)地圖,和它的壽命有結束,訪問一個成員函數(例如獲取一個迭代器)將會 - 就我所讀過的這部分標準而言 - 會導致未定義的行爲。

我也在關注一般關於無序容器和容器的標準部分,並且無法找到上述情況的異常或有關銷燬過程中狀態的任何線索。

所以:不要這樣做。無論是無序容器還是其他任何對象。


順便說一句:什麼樣的調整是有意義的,當你在對象將被破壞的時刻之後呢?

+0

謝謝,標準是我所希望的。當其析構函數具有副作用時(例如,如果垃圾回收),即將被殺死的對象的調整非常重要。 –