double free or corruption (fasttop): 0x091d7a20 **错误-C++

背景:

    最近我闲了在写双向链表的模板类,编译可以通过,但是执行后报错:(

错误:

*** 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

...后面省略

解决方法:

只有两个原因:

1.    内存重复释放,看程序中是否释放了两次空间

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一定要仔细啊!!!

 

你可能感兴趣的:(double free or corruption (fasttop): 0x091d7a20 **错误-C++)