問題は、バイナリツリーノードの削除中にヒープ破損メッセージが表示されてしまうことです。メッセージは言う:無効な書き込みの検出に問題があります
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
に到達すると、それが指しているオブジェクトのデストラクタが呼び出され、次に親のデストラクタ、そして最後にベースクラスのデストラクタ(それらのすべてが空です)がノードの一部であり、すべてではありません。場合によっては、親デストラクタ、時にはヒープ破損メッセージが表示されるベースクラスのデストラクタにあります。
問題の原因は何ですか?