2010-04-19 82 views
5

我得到的錯誤「列表迭代器不dereferencable」使用下面的代碼時:列表迭代器不可取消?

bool done = false; 
while (!_list_of_messages.empty() && !done) { 
    // request the next message to create a frame 
    // DEBUG ERROR WHEN NEXT LINE IS EXECUTED: 
    Counted_message_reader reader = *(_list_of_messages.begin()); 
    if (reader.has_more_data()) { 
     _list_of_frames.push_back(new Dlp_data_frame(reader, _send_compressed_frames)); 
     done = true; 
    } else { 
     _list_of_messages.pop_front(); 
    } 
} 

(開頭行「Counted_message_reader ...」是一個爲有問題的)

注意,錯誤並不總是會發生,但看似隨機的時候(通常是有很多緩衝數據的時候)。

_list_of_messages聲明如下:

std::list<Counted_message_reader> _list_of_messages; 

在周圍的代碼,我們可以做_list_of_messagespop_frontpush_frontsizeemptyend檢查,但沒有erase電話。

我學習了STL文檔,看不到任何明顯的問題。上面的代碼有什麼問題嗎?或者我有一處內存泄漏?

謝謝!不勝感激!

+0

而不是使用*(_ list.begin()),你可以使用_list.front()。 – Patrick 2010-04-19 13:12:18

+0

你是從多個線程訪問列表? – Naveen 2010-04-19 13:15:56

+0

@帕特里克 - 這有什麼區別? – Roderick 2010-04-19 13:20:22

回答

3

你有沒有比賽條件?

如果列表爲空,那麼在嘗試解除引用begin()時會遇到問題,但您會檢查是否爲空。你有另一個線程並行地添加或刪除列表中的項目嗎?

您的代碼片段適用於VS 2008(假設我的typedef Counted_message_readerint)。

+1

嗨Adrian,我沒有其他線程訪問代碼。 Counted_message_reader是一個類,但對於這個例子來說應該不重要。代碼對我來說運行良好 - 這個錯誤似乎是「隨機的」: - / – Roderick 2010-04-19 13:27:29

0

對於列表,迭代器在其引用的列表元素被擦除時會失效。這可能會發生什麼,但我沒有看到它在你的示例代碼中。野指針在什麼地方? (不知道,編碼太多後我可能會失明)。

+0

我已經特別檢查了「擦除」無效,但沒有看到它。沒有指針,我們在其他地方做同樣的尊重,但這只是在本地使用 – Roderick 2010-04-19 13:23:17

+0

pop_front也會擦除,但是當你檢查它時應該在另一個線程中發生以產生任何效果(基本上阿德里安所暗示的)。 – kriss 2010-04-19 13:28:10

3

此斷言通常指示某種內存損壞錯誤,例如,當您從多個線程操縱列表或者您已經覆蓋存儲列表的「記錄」的內存時。

+0

我懷疑被覆蓋的內存,但這不是我想聽到的 - 所以我希望其他問題/建議:) – Roderick 2010-04-19 13:32:59