ダブルフリーまたは破損(ファストトップ):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での削除操作により、別のループが開始され、ループ削除操作が発生します。
最も興味深いのは:
ループによるヘッドポインタとテールポインタの再初期化により、メモリの問題は解消されます。この関数は、サーフェス上のリンクリストを空にすることを実装します。
これは私に長い時間を探すように導きました=。 =
経験:
同様の問題が発生した後、各ループで削除を確認し、国境を越えた問題を検討してください。 !
ループ内の削除には注意が必要です。 ! !