double free or corruption(fasttop):0 x 091 d 7 a 20**エラー-C++
1631 ワード
背景:
最近、双方向チェーンテーブルのテンプレートクラスを書く暇があり、コンパイルは通過できますが、実行後にエラーが発生しました:(
エラー:
*** Error in `./double_list': double free or corruption (fasttop): 0x091d7a20 *** ======= Backtrace: =========/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] ======= Memory map: ======== 08048000-0804a000 r-xp 00000000 08:01 13506938 /home/lwei/projects/learnC++/list/doublelist/double_list
...あと省略
解決方法:
2つの理由があります.
1.メモリの再リリースは、プログラムで2回のスペースが解放されたかどうかを確認します.
2.メモリ限界
ここで最終的に発見されたのは最初の原因で、メモリの境界を越えた検査についてはここでは言わない.
コード・セグメント:
ここでwhileループの内容は書き間違えました.
理由はnode_delはNULLに初期化され、ループ終了時にnode_delはdelete操作を行い,再びループに入り,ループのdelete操作を生じた.
一番面白いのは:
ループの外でヘッドポインタとテールポインタの再初期化作業を行ったため,メモリの問題を捨て,この関数の表面にチェーンテーブルのクリアを実現した.
これは私が長い間探していた=.=
経験:
その後、似たような問題に遭遇したら、各サイクルのdeleteをチェックして、境界問題を考えましょう!!
サイクル中のdeleteは必ず注意してね!!!
最近、双方向チェーンテーブルのテンプレートクラスを書く暇があり、コンパイルは通過できますが、実行後にエラーが発生しました:(
エラー:
*** Error in `./double_list': double free or corruption (fasttop): 0x091d7a20 *** ======= Backtrace: =========/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] ======= Memory map: ======== 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;
// index size_
// removeAt(size_t index)
// :
// , ,
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はdelete操作を行い,再びループに入り,ループのdelete操作を生じた.
一番面白いのは:
ループの外でヘッドポインタとテールポインタの再初期化作業を行ったため,メモリの問題を捨て,この関数の表面にチェーンテーブルのクリアを実現した.
これは私が長い間探していた=.=
経験:
その後、似たような問題に遭遇したら、各サイクルのdeleteをチェックして、境界問題を考えましょう!!
サイクル中のdeleteは必ず注意してね!!!