2015-12-04 49 views
3

我真的试图推迟提出这个问题,因为它看起来应该是一个简单的问题,但这里就是这样。我一直在一段新的代码中追逐段错误。我已经包含了下面显示问题的最小块。其余的代码已经工作了一段时间。当访问成员STL地图时出现C++ segfault

class A { 
private: 
    std::map <uint64_t, uint32_t> memberMap; 
public: 
    A(); 
    ~A(); 
    void access() { 
     const uint64_t key = 1; 
     uint32_t value = 1; 
     if(memberMap.count(key) == 0) { 
      memberMap.insert(std::pair<uint64_t, uint32_t>(key, value)); 
     } else if(memberMap[key] < value) { 
      memberMap[key] = value; 
     } 
    } 
}; 

class B : public BsParent { 
private: 
    A handler; 
public: 
    B(); 
    ~B(); 
    uint64_t access(Data dat) { 
     //... 
     handler.access(); 
     //... 
    } 
}; 

我到目前为止已经试过......

  • 你会发现有明确的零个指针。
  • 我检查了A()被调用。
  • 来自gdb的堆栈跟踪(yep,已经广泛使用并且没有明显的空指针)将stme_tree.h:1157中的责任钉在了定义pair函数的指针上。但是,如果我注释掉插入行和else if块,则程序仍会在stl_tree中另一个模糊的行号处进行段错误。
  • 我测试了access()中的代码,使memberMap成为访问中的局部变量并在循环中调用代码。

有关进一步调试步骤的任何想法或建议?

+0

尝试valgrind和/或海湾合作委员会或叮当的记忆消毒剂选项,感觉就像你玩的死对象或堆放在某处堆栈或堆栈。如果没有完整的,最小的代码片段,实际上会重现该问题,则无法分辨。 – Mat

+0

似乎还有其他东西破坏了属于地图的内存。尝试放置数据修改断点。 –

+1

请发表[mcve]。如果我按照原样举例,我无法重现问题。 –

回答

0

可能你已经修整了原始代码以保持简单性,但它没有正确传达问题并且不可重现。

尽管它看起来没有任何问题,但如果您使用非本地和本地类类型键/值对的映射,则可能需要这两者的复制构造函数。