下面的代码停止工作,显示一个空屏幕,显示一个数字,然后打印代码停止工作的错误消息。
#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显示了我的程序的输出
问题是insertlast(long)
中的这一行:
newlink=last;
应该是:
last=newlink;
修改后,输出变成:
<>之前第一->最后44223388One hundred.之前EDIT:正如@Jared指出的,你的代码存在内存泄漏。当您使用new
或malloc
分配堆内存,但不使用相应的"free"函数释放堆内存时,就会发生这种情况。
重要的是,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
的结果,因此在使用指向动态分配内存的不同区域的指针覆盖first
之前,需要先设置delete first
。
同时,你需要在你的类中添加:
- 一个析构函数,释放所有没有通过调用
deletefirst()
释放的内存。 - 一个复制构造函数,用于对
firstlast
实例进行深度复制。 - 赋值操作符
operator=(const firstlast& fl)
的重载,它也进行深度复制。
首先,您的insertLast方法会导致内存泄漏,因为您从未实际将新创建的链接的next指针连接到任何东西。您只需重新分配本地指针newlink,该指针随后立即超出作用域。随后的insertLast调用将内存保留在空间中。这也可能导致打印错误。
其次,你的deleteFirst方法实际上并没有删除任何东西,而是在内存中留下一个由new out分配的链接,没有任何指向它的东西。另一个内存泄漏