以下代码停止工作,显示空白屏幕,显示一个数字,然后输出代码停止工作的错误消息。
#include <iostream>
using namespace std;
class Link{
public:
long ddata;
Link *next;
Link(long d){
ddata=d;
}
void displaylin(){
cout<<ddata<<" "<<endl;
}
};
class firstlast{
private :
Link *first;
Link * last;
public:
firstlast(){
first=NULL;
last=NULL;
}
bool empthy(){
return (first==NULL);
}
void insertfirst(long dd){
Link *newlink=new Link(dd);
if (empthy())
last=newlink;
newlink->next=first;
first=newlink;
}
void insertlast(long dd){
Link *newlink=new Link(dd);
if ((empthy()))
first=newlink;
else
last->next=newlink;
newlink=last;
}
long deletefirst(){ //delete first link
long temp=first->ddata;
if (first->next==NULL)//only one item
last=NULL;
first=first->next;
return temp;
}
void displayList(){
cout<<"first -> last "<<endl;
Link *current=first;
while(current!=NULL){
current->displaylin();
current=current->next;
}
}
};
int main(){
firstlast *fl=new firstlast();
fl->insertfirst(22);
fl->insertfirst(44);
fl->insertfirst(66);
fl->insertlast(33);
fl->insertlast(88);
fl->insertlast(100);
fl->deletefirst();
fl->displayList();
return 0;
}
我觉得某处是溢出,但我无法找到。 IDE One shows the output of my program.
答案 0 :(得分:1)
问题在于insertlast(long)
:
newlink=last;
应该是:
last=newlink;
通过此更改,the output变为:
first -> last 44 22 33 88 100
编辑:正如@Jared指出的那样,您的代码会遭受内存泄漏。只要您使用new
或malloc
分配堆内存,但不使用相应的“免费”功能释放堆内存,就会发生这种情况。
new
返回的每个指针都必须由delete
完全释放一次。如果您未能调用delete
,那么您的程序会泄漏内存。如果您多次调用delete
以“双重释放”某个区域,那么您的程序将调用未定义的行为。
在此代码中:
long deletefirst(){ //delete first link
long temp=first->ddata;
if (first->next==NULL)//only one item
last=NULL;
first=first->next;
return temp;
}
请注意first=first->next;
会使您失去指向动态分配内存的指针。请记住,first
已设置为new
的结果,因此在使用指向动态分配内存的不同区域的指针覆盖delete first
之前,需要first
。
此外,您需要添加到您的班级:
deletefirst()
释放的所有内存。firstlast
个实例的深层副本。operator=(const firstlast& fl)
的重载,它也会进行深层复制。答案 1 :(得分:1)
首先,您的insertLast方法会导致内存泄漏,因为您实际上从未将新创建的链接的下一个指针连接到任何内容。你只需重新分配本地指针newlink,它会立即超出范围。后续的insertLast调用会将内存留在空间中。这也可能导致打印错误。
其次,你的deleteFirst方法实际上并没有删除任何东西,但留下了一个在内存中分配了new out的Link,而没有任何指向它的东西。另一个内存泄漏。