2011-07-26 56 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

鑑於地圖屬於另一個對象,它可疑地發出聲明,當清除被調用時,擁有地圖的對象已被刪除。

另請注意,以下劃線和大寫字母開頭的名稱是爲實現保留的 - 您不允許使用它們。

相關問題