我正在尝试调试我们的程序在下面的'addToOurSet`方法中崩溃(segfault)的问题:
class SomeClass {
// ( ... )
void addToOurSet(SomeOtherClass* obj) { ourSet.insert(obj); }
std::set<SomeOtherClass*> ourSet;
};
由于(包括所涉及的复杂性和大数据大小以及在调试版本中无法重现;以上示例显然高度简化),崩溃难以重现。回溯显示崩溃发生在:
std::_Rb_tree<...>::insert_unique(SomeOtherClass* const&)
我的问题是:什么可能导致ourSet.insert(...)
方法崩溃?据我所知,插入对象本身没有任何东西可以导致它,因为它是一个指针。正确?那我在看这个集合本身的问题吗?显然,如果set指针由于某种原因无效,那么调用可能会崩溃,但是例如某些操作可能导致它以这种方式无效(比如删除它的结尾或者被禁止的东西)? / p>
答案 0 :(得分:3)
有几种可能性:
set
本身无效(封闭的SomeClass
实例已被删除,或正在通过悬空指针等进行访问。)我可能会从valgrind
或类似工具开始。
答案 1 :(得分:1)
我最近遇到了类似的问题。事实证明,我对同一个类有 2 个略有不同的声明。在 foo.h 中:
class SomeClass {
// ( ... )
void addToOurSet(SomeOtherClass* obj) { ourSet.insert(obj); }
std::set<SomeOtherClass*> ourSet;
};
在 bar.h 中:
class SomeClass {
// ( ... )
std::vector<SomeOtherClass*> ourSet;
};
它编译得很好,但在