导致std :: set :: insert崩溃的原因

时间:2012-01-10 16:27:40

标签: c++ stl set

我正在尝试调试我们的程序在下面的'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>

2 个答案:

答案 0 :(得分:3)

有几种可能性:

  1. set本身无效(封闭的SomeClass实例已被删除,或正在通过悬空指针等进行访问。)
  2. 某处存在内存损坏。
  3. 我可能会从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;
};

它编译得很好,但在 中存在严重的段错误。