ダブルフリーまたは破損(ファストトップ):0x091d7a20 **エラー-C ++



Double Free Corruption



バックグラウンド:

最近、二重リンクリストのテンプレートクラスを書くのに忙しかった。コンパイルに合格することはできますが、実行後にエラーが発生します。

エラー:

*** `./double_list 'のエラー:ダブルフリーまたは破損(fasttop):0x091d7a20 ***
=======バックトレース:=========
/lib/i386-linux-gnu/libc.so.6(+0x67377)[0xb7bf2377]
/lib/i386-linux-gnu/libc.so.6(+0x6d2f7)[0xb7bf82f7]
/lib/i386-linux-gnu/libc.so.6(+0x6dc31)[0xb7bf8c31]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x18)[0xb7dccd88]
./double_list[0x80490f1]
./double_list[0x8048d29]
./double_list[0x8048bce]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf7)[0xb7ba3637]
./double_list[0x80487b1]
=======メモリマップ:========
08048000-0804a000 r-xp 00000000 08:01 13506938 / home / lwei / projects / learnC ++ / list / doublelist / double_list



...後で省略

解決:

理由は2つだけです。



1.メモリが繰り返し解放されます。プログラムでスペースが2回解放されるかどうかを確認してください。

2.範囲外のメモリ

ここでの最後の発見が最初の理由です。範囲外のメモリに関するチェックについては、ここでは説明しません。



私のコードスニペットでは:

template void List::clear() { Node *node_del = NULL Node *temp = head->next / / Think of it can also use the index loop size_ times / / Loop delete call removeAt (size_t index) //But the reason for not using this method is: / / Without this implementation is simple, will reduce the efficiency of the linked list, especially the large linked list while(node_del != tail) { node_del = temp temp = temp->next delete node_del } head->next = tail tail->prev = head size_ = 0 }

whileループの内容が間違っているため、次のように変更する必要があります。

while(temp != tail)

その理由は、node_delがNULLに初期化されるためです。ループの最後に、node_delでの削除操作により、別のループが開始され、ループ削除操作が発生します。

最も興味深いのは:

ループによるヘッドポインタとテールポインタの再初期化により、メモリの問題は解消されます。この関数は、サーフェス上のリンクリストを空にすることを実装します。

これは私に長い時間を探すように導きました=。 =

経験:

同様の問題が発生した後、各ループで削除を確認し、国境を越えた問題を検討してください。 !

ループ内の削除には注意が必要です。 ! !