new ,delete 疑问
- C/C++ code
//为什么使用delete 出现错误?template <typename T> void Linklist<T>::Insert(int i,T x) { if(i<0||i>length+1) //抛出异常 throw Overflow(); if(length==0)//由于第一个节点不同于其它节点的插入 {//可以直接把 pt节点连接在first(头接点)的后面 Node<T> *pt=new Node<T>; pt->data=x; first->next=pt; pt->next=NULL;//最后pt要指向空 // delete pt; //为什么收回空间会出现错误? } else { Node<T> *p=first; for(int j=0;j<i-1&&p;j++) p=p->next;//找到要插入的位置 Node<T> * newdata=new Node<T>; newdata->data=x;//一般插入节点 newdata->next=p->next; p->next=newdata;// delete newdata;//出现错误 } length++; } template <typename T> void Linklist<T>::Delete(int i) { if(i<0||i>length)//抛出异常 throw Overflow(); else { Node<T> *p=first->next; for(int j=0;j<i-2;j++) p=p->next;//找到要删除节点位置之前的节点 Node<T> *q=new Node<T>; q=p->next;//删除节点 p->next=q->next; delete q;//为什么这没有出现错误呢? } length--; }
[解决办法]
给出完整测试程序
[解决办法]
Node<T> *pt=new Node<T>;
pt->data=x;
first->next=pt;
pt->next=NULL;//最后pt要指向空
// delete pt; //为什么收回空间会出现错误?
这一段不是矛盾吗? 你把申请的新节点空间放在 first->next 上,这个时候,pt 和 first->next 都指向同一位置,然后你又马上删除 delete pt;,等于也就是删除了 first->next 。那你后面用到first-〉next 数据的时候肯定出错。
后面的这段:
for(int j=0;j<i-2;j++)
p=p->next;//找到要删除节点位置之前的节点
Node<T> *q=new Node<T>;
q=p->next;//删除节点
p->next=q->next;
delete q;//为什么这没有出现错误呢?
你好像写错了。你再看看吧。如果 Node<T> *q=new Node<T>; q=p->next;那么你前面用 new 干什么?
[解决办法]
up
[解决办法]
同意3楼的,根本无需delete。