2012-01-27 497 views
0

迭代集合時出現分段錯誤。堆棧跟蹤點 0x000000081193ccc5中的std :: _ Rb_tree_increment(__X =爲0x1)在標準:: _ Rb_tree_const_iterator ::運算++ /libstdc++/src/tree.cc:68 0x0000000806c3107e在stl_tree.h:266來自std :: _ Rb_tree_increment(__x = 0x1)的分段錯誤

但我沒有更多的信息,但最後的崩潰線如下。迭代器在一個集合上。

typedef std::set<test*,test_less> test_set_t; 

    test_set_t& set(bt->getSet()); // getSet() will return reference to the class bt member variable set 

test_set_t::iterator pos = set.begin(); 

test empty(val); 
test* last_ptr = &empty; 

for (; pos != set.end(); last_ptr = *pos++) {  // gdb shows this as last line 

我看不到問題。提前致謝。

+0

請顯示循環體內的內容,因爲錯誤可能是由內存中的內容引起的(但只能通過您提到的行來識別)。 – 2012-01-27 14:31:39

+0

一個完整的小型測試用例可以用來追蹤這個bug,因爲它看起來像是在某個地方調用UB,並且由於UB的症狀可以出現在任何地方,而不是在導致它的那一行,所以呈現真實代碼是唯一的理智方式以結構化的方式調試內容。 – PlasmaHH 2012-01-27 14:35:28

回答

1

最有可能是該集是空的,或者您刪除了項目pos在迭代時指向的項目。

+0

由於我得到的這個崩潰不是可重複的,而且在這裏討論它的內部代碼很複雜(作爲調用函數)。有人可以建議在示例程序的幫助下獲得相同的核心。這對我來說是非常有幫助的。 – Omprakash 2012-02-01 12:22:40