我得到的問題是我在刪除二叉樹節點期間收到了堆損壞消息。有消息稱:檢測到無效的問題
HEAP [lab4.exe]:堆:免費堆塊5788c0修改的5788e8 它被釋放Windows已經引發了lab4.exe斷點之後。
這可能是由於堆損壞引起的,這表明lab4.exe或其加載的任何DLL中存在一個錯誤。
這也可能是由於用戶按F12而lab4.exe具有 焦點。
這聽起來像我正在寫入一塊已被釋放的內存。 Valgrind的似乎與像消息,以確認這一點:
在0x8049C65大小4
的無效的寫:>二叉樹:: removeTree(二叉樹::節點*)(在/淨/梅蒂斯/ HOME2/alexo2/lab4 /的a.out)
...
== 9681 ==地址0x402ab50是在0x40054B4大小12 free'd
的塊內的0字節:操作者刪除(無效*)(vg_replace_malloc.c:346) 由0x8049C61 :BinTree :: removeTree(BinTree :: Node *)( /net/metis/home2/alexo2/lab4/a.out)
...
當我追蹤程序時,堆損壞消息通常在父類或基類析構函數中開始。我一直在試圖追查這一點,但我不知道問題出在哪裏。我從來沒有使用這些節點上的刪除直到析構函數。
我懷疑問題與我刪除或跟蹤二叉樹的方式有關。以下是我將發佈的一些代碼,不確定它是否有助於查找解決方案。
所以,一個類對象是動態分配的,並被一個函數返回。這個對象跟蹤指針,直到它最終被插入二叉樹的節點。 在當一切都被刪除的程序結束後,調用析構函數:
void BinTree::makeEmpty()
{
if (root != NULL) {
removeTree(root);
}
root = NULL;
}
void BinTree::removeTree(Node *curr)
{
if (curr == NULL)
return;
removeTree(curr->left);
removeTree(curr->right);
delete curr->data;
delete curr;
curr->data = NULL;
curr = NULL;
}
在某些功能,這是一個創建並返回動態分配的對象調用:
Item *aMovie = factory.createMovie(code.c_str());
在只有一些節點,不是全部節點,當到達刪除curr->data
時,調用它所指向的對象的析構函數,然後是父級的析構函數,最後是基類析構函數(全部爲空)。有時它在父析構函數中,有時是堆腐敗消息顯示的基類析構函數。
關於問題可能源自何處的任何建議?