2013-01-08 35 views
0

我收到運行時錯誤被釋放的指針未被分配 - 如何調試?

malloc: *** error for object 0x10070c5c0: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 

以下堆棧跟蹤:

enter image description here

這告訴我,不順心的事在析構函數~Clustering~NodeMap(第一個是空的第二個調用delete[]),但不是「正在釋放的指針」所在的位置。我怎樣才能找到這個?

另外,在哪裏是malloc_error_break

+3

在valgrind或任何此類內存泄漏/損壞檢測工具下運行它。 –

+2

閱讀「[三條法則](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-ree)」。 –

+1

「*這告訴我在析構函數'〜Clustering'和'〜NodeMap'(它們是空的存根)*」中出錯了。我不認爲他們都是空的。我很確定'〜NodeMap()'調用'delete []'。 –

回答

2

這告訴我,不順心的事在析構函數~Clustering~NodeMap(第一個是一個空存根,第二個叫delete[]),而不是其中的「指針被釋放」的說法。

只因爲~Clustering是「一個空的存根」並不意味着它不會做任何事情。在執行析構函數的主體之後,析構函數爲每個直接的非變量非靜態數據成員調用析構函數。顯然你的班級Clustering包含一個NodeMap<long,long>類型的數據成員。

我該如何發現這一點?

您的類NodeMap<long,long>包含多少個分配的數組?如果只有一個,那就是那個。如果有多個,請在~NodeMap中設置一個斷點,以便逐步執行。

+0

'集羣'從'NodeMap'派生。數組確實是錯誤的來源,我相信我必須實現一個正確的拷貝構造函數來解決這個問題。 – clstaudt

3

你有複製構造函數複製分配的內存嗎?如果沒有複製構造函數,或者它沒有複製已分配的內存,則兩個對象的析構函數試圖釋放相同的內存位置。

+0

我沒有複製構造函數。這似乎是潛在的問題。 – clstaudt

相關問題