我一直在挣扎几个月的分段错误,现在我在这里寻求帮助。 段故障出现时,我调用下面的函数分段错误调用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()来清除它。我真的很感激你的意见。谢谢。
该错误必须在别处。无论地图是否为空,您都可以调用clear()。向我们展示更多环境代码。 –
如果按值传递地图,会发生什么情况,程序语义会错误,但是会不会segf'? – 111111
是作为参数传递给分配在堆上的'foo'的对象吗?如果是这样,是否有可能之前已经撤销(或迁移到其他地方)? –