我有一個模擬程序。在模擬的主要類中,我正在「創建+添加」和「刪除+銷燬」代理。在運行時添加和刪除列表
問題是,有一次(每3-4次運行一次程序)程序崩潰,因爲我顯然在主循環中調用無效代理的函數。該程序在大多數時間工作得很好。列表中通常有數千個代理。
- 我不知道我的循環中有無效代理的可能性如何。
調試代碼非常困難,因爲我在「Agent :: Step函數」內部收到內存異常(這太遲了,因爲我無法理解列表中的無效代理是如何調用的)。
當我查看Agent :: Step函數內的代理引用(異常點)時,代理中的數據沒有意義,甚至沒有初始化數據。所以這絕對是無效的。
void World::step() { AddDemand(); // run over all the agents and check whether they have remaining actions // Call their step function if they have, otherwise remove them from space and memory list<Agent*>::iterator it = agents_.begin(); while (it != agents_.end()) { if (!(*it)->AllIntentionsFinished()) { (*it)->step(); it++; } else { (*it)->removeYourselfFromSpace(); //removes its reference from the space delete (*it); agents_.erase(it++); } } } void World::AddDemand() { int demand = demandIdentifier_.getDemandLevel(stepCounter_); for (int i = 0; i < demand; i++) { Agent* tmp = new Agent(*this); agents_.push_back(tmp); } } Agent: bool Agent::AllIntentionsFinished() { return this->allIntentionsFinished_; //bool flag will be true if all work is done }
1-難道循環(即在多線程,如果可能的運行)的VStudio 2012優化造成的問題?
2-關於調試代碼的任何建議?
謝謝。它是否也適用於列表(因爲我使用列表而不是矢量)。 我不使用線程,但我認爲vstudio 2012編譯器嘗試使用線程(如果它認爲可以)。 – wmac
呃,是的 - 抱歉,那是錯誤的鏈接 - 它實際上是我嘗試鏈接的頁面引用的位置,但鏈接到列表頁面會更有意義:) – kfsone
更改順序並未解決問題。使用「it = agents_erase(it);」也沒有解決問題。我想我應該再仔細看看我的所有代碼。你的鏈接也指向同樣的問題btw。 – wmac