2011-12-09 62 views
0

我得到的問題是我在刪除二叉樹節點期間收到了堆損壞消息。有消息稱:檢測到無效的問題

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時,調用它所指向的對象的析構函數,然後是父級的析構函數,最後是基類析構函數(全部爲空)。有時它在父析構函數中,有時是堆腐敗消息顯示的基類析構函數。

關於問題可能源自何處的任何建議?

回答

1

此:

delete curr->data; 
delete curr; 

curr->data = NULL; 
curr = NULL; 

是錯誤的。在delete d curr之後,您不應該寫入curr->data。甚至沒有NULL