2011-12-09 10 views
0

問題は、バイナリツリーノードの削除中にヒープ破損メッセージが表示されてしまうことです。メッセージは言う:無効な書き込みの検出に問題があります

HEAP [lab4.exe]:HEAP:無料ヒープブロック5788c0が、それはWindowsがlab4.exeにブレークポイントをトリガした解放された 後5788e8に変更します。

これは、 lab4.exeまたはそれがロードしたいずれかのDLLのバグを示す、ヒープの破損による可能性があります。

これは、lab4.exeが にフォーカスしている間にユーザーがF12を押したことが原因である可能性もあります。

私は解放されたメモリブロックに書き込んでいるようです。

0x8049C65でサイズ4
の無効な書き込み:> BinTree :: removeTree(BinTree ::ノード*)(/ネット/ METISで/ホーム2/alexo2/LAB4/Valgrindのは、のようなメッセージでこれを確認しているようですa.outの)
...
== 9681 ==アドレス0x402ab50は0x40054B4でサイズ12 free'd
のブロック内の0バイトです:0x8049C61によって346) :演算子は、(void *型)(vg_replace_malloc.cを削除します:BinTree :: removeTree(BinTree :: Node *)( /net/metis/home2/alexo2/lab4/a.out)
...

プログラムをトレースすると、通常、ヒープ破損メッセージは親クラスまたは基本クラスのデストラクタで開始されます。私はこれを追跡しようとしてきましたが、どこに問題があるのか​​わかりません。私はデストラクタまでこれらのノードでdeleteを使うことはありません。

問題は、私がバイナリツリーを削除したり追跡したりする方法と関係があると思われます。投稿するコードはいくつかありますが、解決策を見つけるのに役立つかどうかはわかりません。

したがって、クラスオブジェクトは動的に割り当てられ、関数によって返されます。このオブジェクトは、最終的にバイナリツリーのノードに挿入されるまで、ポインタで追跡されます。プログラムの最後にすべてが削除されているときに、デストラクタが呼び出された時 を:オン

Item *aMovie = factory.createMovie(code.c_str()); 

:いくつかの機能で

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; 
} 

、これは動的に割り当てられたオブジェクトを作成し、返す呼び出しですcurr->dataに到達すると、それが指しているオブジェクトのデストラクタが呼び出され、次に親のデストラクタ、そして最後にベースクラスのデストラクタ(それらのすべてが空です)がノードの一部であり、すべてではありません。場合によっては、親デストラクタ、時にはヒープ破損メッセージが表示されるベースクラスのデストラクタにあります。

問題の原因は何ですか?

答えて

1

この:

delete curr->data; 
delete curr; 

curr->data = NULL; 
curr = NULL; 

が間違っています。 delete d currの後にcurr->dataに書き込むべきではありません。さらにNULL

関連する問題