模板种代码在Release时运行正常,Debug时编译无错,运行出错,提示非法访问

模板类代码在Release时运行正常,Debug时编译无错,运行出错,提示非法访问
本帖最后由 wsfxzxb 于 2013-01-11 19:04:36 编辑
以下模板类代码在Release时编译运行均无错,Debug时编译无错,运行报错,提示非法内存访问(编译器:VS2005)。找了很久找不出来,请大神帮忙看看是啥原因:

#include<iostream>
using namespace std;


template<typename T> class  List;

// 私有类,防止用户构建对象 ListItem 对象
template<typename T> class ListItem
{
friend List<T>; // 友元,以便用 List 构建 ListItem 元素
ListItem(const T& t):item(t),next(0){}
T item;
ListItem *next;
};

template<typename T> class  List
{
public:
List():head(0),tail(0){}

List(const List &q):head(0),tail(0){copy_elems(q);}
List& operator=(const List&);
~List(){destory();}

T& front(){return head->item;}
const T& front()const{return head->item;}
size_t size();
void push(const T&);
bool empty()const{return head==0;}

private:
ListItem<T> *head;
ListItem<T> *tail;
void destory();
void copy_elems(const List &);

};


// 赋值操作符
template<typename T> List<T>&  List<T>:: operator=(const List<T> &q)
{
destory();
copy_elems(q);  // 在 push 第一个元素时设置 head 和 tail,继续添加时重设 tail,详见 push 函数
return *this;
}

// 得到 List 大小
template<typename T> size_t List<T>:: size()
{
size_t n=0;
for(ListItem<T> *pt=head;pt;pt=pt->next)
++n; 
return n;
}

// 在末尾添加一个元素
template<typename T> void List<T>::push(const T& item)
{
ListItem<T> *pt=new ListItem<T>(item);
if(empty())
head=tail=pt;   // 在 push 第一个元素时设置了 head
else
{
tail->next =pt; // 原来 tail 的 next 成员指向新元素指针
tail=pt;        // 类的 tail 成员更新为新元素指针
}

}

// 实用函数:删除所有元素
template<typename T> void List<T>::destory()
{
while(head)
{
delete head;
head=head->next;
}
}

// 实用函数:复制所有元素
template<typename T> void List<T>::copy_elems(const List &q)
{
for(ListItem<T> *pt=q.head;pt;pt=pt->next)
push(pt->item);  // 在 push 第一个元素时设置 head 和 tail,继续添加时重设 tail,详见 push 函数
}


int main()
{
List<int> q;

for(int i=1;i!=10;++i)
q.push(i);
cout<<"首元素为:"<<q.front()<<endl;
cout<<"共有元素:"<<q.size()<<endl;

system("pause");
return 0;
}

------解决方案--------------------

销毁函数这么写:
// 实用函数:删除所有元素
template<typename T> void List<T>::destory()
{
ListItem<T> *p = head;
while(head)
{
p = head->next;
delete head;
head = p;
}
}