模板种代码在Release时运行正常,Debug时编译无错,运行出错,提示非法访问
模板类代码在Release时运行正常,Debug时编译无错,运行出错,提示非法访问
以下模板类代码在Release时编译运行均无错,Debug时编译无错,运行报错,提示非法内存访问(编译器:VS2005)。找了很久找不出来,请大神帮忙看看是啥原因:
------解决方案--------------------
以下模板类代码在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;
}
}