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.メモリ限界
ここで最終的に発見されたのは最初の原因で、メモリの境界を越えた検査についてはここでは言わない.
コード・セグメント:
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は必ず注意してね!!!