2011-07-26 58 views
3

我一直在挣扎几个月的分段错误,现在我在这里寻求帮助。 段故障出现时,我调用下面的函数分段错误调用std :: map :: clear

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()函数,它显示了“双自由或损坏”的错误,并且程序中止在调用C++/4.1.2/ext/new_allocator.h:94 delete(__ P)进一步从gnu库/lib64/libc.so.6调用free()。但是由于地图中的元素不是由新的元素分配的,为什么它仍然调用free()来清除它。我真的很感激你的意见。谢谢。

+0

该错误必须在别处。无论地图是否为空,您都可以调用clear()。向我们展示更多环境代码。 –

+1

如果按值传递地图,会发生什么情况,程序语义会错误,但是会不会segf'? – 111111

+1

是作为参数传递给分配在堆上的'foo'的对象吗?如果是这样,是否有可能之前已经撤销(或迁移到其他地方)? –

回答

1

代码对我来说看起来很好。至少在您提供的有限背景下。通常,当我遇到类似这样的问题时,我会简单地运行valgrind memcheck工具来查找发生第一个“删除”的位置。一旦你知道了,这些问题可以非常简单地解决。

2

鉴于地图属于另一个对象,它可疑地发出声明,当清除被调用时,拥有地图的对象已被删除。

另请注意,以下划线和大写字母开头的名称是为实现保留的 - 您不允许使用它们。

相关问题