来自std::_Rb_tree_increment(__x=0x1)的分段错误

Segmentation fault from std::_Rb_tree_increment (__x=0x1)

本文关键字:0x1 分段 错误 Rb std tree increment 来自      更新时间:2023-10-16

我在迭代一个集合时遇到分段错误。

堆栈跟踪指向:

  0x000000081193ccc5 in std::_Rb_tree_increment (__x=0x1) at /libstdc++/src/tree.cc:68
  0x0000000806c3107e in std::_Rb_tree_const_iterator<test *>::operator++     at stl_tree.h:266

但我没有得到更多的信息,但崩溃的最后一行如下。

迭代器在集合上。

 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

我看不出这个问题。提前谢谢。

很可能是集合为空,或者您在迭代时删除了pos所指向的项。

我遇到了类似的问题

set<int> sec;
sec.insert(1);
set<int>::iterator iter = sec.begin();
iter = sec.erase(iter);
cout << 1 << endl;
iter = sec.erase(iter);
cout << 1 << endl;

_如果传递给Rb_tree_increment的迭代器无效或损坏,例如空集的结束迭代器,则它可能被锁定。所以我们可以插入Sentinel节点来保证集合不会为null或者检查集合是否为null。