我正在跟踪一个错误,我遇到了非常奇怪的行为。我有一组指针,当我一个接一个地擦除它们时,第一个会擦除,但是擦除另一个会导致我出现段错误。我用
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);
}
有任何想法吗?我不知道它如何导致段错误,当没有这样的元素时,擦除应该只返回 0。或者当试图从空容器中删除某些东西时它可能会崩溃?(当添加 3 个不同的指针后集合的大小仅为 2 时,我有另一个错误,但这是另一回事)。