我几个月来一直在努力解决分段错误,现在我来这里寻求帮助。 当我调用以下函数时会出现分段错误
void foo(..., std::map<MyClass*, double> & x) {
if ( !x.empty() ) x.clear();
...
}
Class A {
private:
map<MyClass*, double> _N;
public:
void f(...) {
foo(..., _N);
...
}
};
//in main routine, the function is called in a loop
A a;
while(...) {
a.f(...);
}
使用gdb,我将错误添加到调用clear()函数的行,它显示“double free or corruption”错误,程序在调用c ++ / 4.1.2 / ext / new_allocator.h时中止:94删除(__P)进一步调用gnu库/lib64/libc.so.6中的free()。但由于地图中的元素不是由new分配的,为什么它仍然会调用free()来清除它。我非常感谢你的评论。谢谢。
答案 0 :(得分:2)
鉴于地图是由另一个对象拥有的,可疑的是,在调用clear时,已经删除了地图拥有对象。
另请注意,以下划线和大写字母开头的名称是为实现保留的 - 您不能使用它们。
答案 1 :(得分:1)
代码看起来很好。至少在你提供的有限背景下。通常当我遇到这样的问题时,我会简单地运行valgrind memcheck工具来找到第一个发生“删除”的地方。一旦你知道,这些问题可以很容易解决。