2013-10-26 41 views
1

我想不通爲什麼這個異常拋出remove。我在Object.cpp以下代碼:列表迭代器不兼容斷言失敗

// Initialize class. 
int Object::nextID = 0; 
list<Object*> Object::objects; 

Object::Object(string name) 
{ 
    SetName(name); 
    nextID++; 
    objects.push_back(this); 
} 


Object::~Object() 
{ 
    // Remove from the list of objects. 
    objects.remove(this); 
} 

Object我獲得其他類和對象正在堆上創建並退居shared_ptr秒。沒有其他代碼指代Object::objects,這是一個靜態變量。

在調試器(我正在使用VS2013)中,我注意到奇怪的步進行爲,空行被踩入並在從未調用的代碼之間跳來跳去,所以我不確定這是否是一個錯誤VS2013。如果它有所作爲,我在其他地方使用了C++ 11的一些新功能。

此外,當調用析構函數時,objects的大小爲0,即使我已經看到它在構造函數中增加到1。誰能幫忙?

還有一件事:代碼在GCC/Code :: Blocks中運行得很好。

更新:我想我知道爲什麼,但我需要找到一個解決方案:它是靜態對象的破壞順序。我從Object派生出GameObject,我在另一個靜態變量中保留GameObjects的共享指針,而不是Object指針。現在這些共享指針在程序終止時釋放,但那時上面的指針的靜態列表可能已經被破壞。

+0

難道你沒有忘記在VS禁用優化? – mvidelgauz

+0

優化是diabled。 –

+1

可能你沒有運行你認爲你正在運行的代碼。將一些'OutputDebugString'添加到代碼中,重新編譯並觀察調試輸出窗口。與其成爲編譯器錯誤的可能性相差甚遠。 – Yakk

回答

1

問題是銷燬靜態物體的順序爲。我從Objects派生GameObjects,並保留一個靜態的指向GameObjects的指針的共享指針列表,以及上面的指向Objects的原始指針的靜態列表。共享指針在程序終止時釋放,但那時原始指針列表已被銷燬,因此斷言失敗。

這顯然是一個糟糕的設計決定。

0

調試器怪異的步進行爲是試圖在調試器中運行發佈版本的典型。改爲使用調試版本。

+0

這是一個調試版本。 –

+0

@ ScottMcP-MVP,我問我的問題,因爲我(和我工作的整個團隊)總是使用發佈版本,但禁用了優化,允許正確的調試器步進。我們在開發機器上使用本地構建,並在構建服務器優化啓用 – mvidelgauz

+0

我已經「解決」了對象列表斷言失敗通過刪除對象列表,到目前爲止,我不需要。但奇怪的腳步仍在!我也試過重建,一樣。 –