バグを追跡していて、非常に奇妙な動作に遭遇しました。ポインターのセットがあり、それらを1つずつ消去すると、最初のポインターが消去されますが、別のポインターを消去するとセグメンテーション違反が発生します。私が使う
size_type erase( const key_type& key );
したがって、イテレータを使用することはできません。私のデバッガーは、コールスタックで次のことを示しています。
0 - std::less<cSubscriber *>::operator() //cSubscriber is an abstract base class and I have a set of cSubscriber *
1 - std::_Rb_tree<cSubscriber*, cSubscriber*, std::_Identity<cSubscriber*>, std::less<cSubscriber*>, std::allocator<cSubscriber*> >::equal_range
2 - std::_Rb_tree<cSubscriber*, cSubscriber*, std::_Identity<cSubscriber*>, std::less<cSubscriber*>, std::allocator<cSubscriber*> >::erase
3 - std::set<cSubscriber*, std::less<cSubscriber*>, std::allocator<cSubscriber*> >::erase
4 - cEventSystem::unsubscribe //my function, it is as follows in the class which has the set as its member
cEventSystem::unsubscribe(cSubscriber * ptr)
{
set.erase(ptr);
}
ベース cSubscriber 抽象クラスには、仮想デストラクタがあります。
virtual ~cSubscriber()
{
eventSystem.unsubscribe(this);
}
何か案は?どうすれば segfault が発生するのかわかりません。そのような要素がない場合、消去は 0 を返すだけです。それとも、空のコンテナから何かを消去しようとするとクラッシュするのでしょうか? (3つの異なるポインターを追加した後、セットのサイズが2つしかない場合、別のバグがありますが、それは別の話です)。