我一直在掙扎幾個月的分段錯誤,現在我在這裏尋求幫助。 段故障出現時,我調用下面的函數分段錯誤調用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'的對象嗎?如果是這樣,是否有可能之前已經撤銷(或遷移到其他地方)? –