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成为访问中的局部变量并在循环中调用代码。
有关进一步调试步骤的任何想法或建议?
尝试valgrind和/或海湾合作委员会或叮当的记忆消毒剂选项,感觉就像你玩的死对象或堆放在某处堆栈或堆栈。如果没有完整的,最小的代码片段,实际上会重现该问题,则无法分辨。 – Mat
似乎还有其他东西破坏了属于地图的内存。尝试放置数据修改断点。 –
请发表[mcve]。如果我按照原样举例,我无法重现问题。 –