双尾列表



下面的代码停止工作,显示一个空屏幕,显示一个数字,然后打印代码停止工作的错误消息。

#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指出的,你的代码存在内存泄漏。当您使用newmalloc分配堆内存,但不使用相应的"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

同时,你需要在你的类中添加:

  1. 一个析构函数,释放所有没有通过调用deletefirst()释放的内存。
  2. 一个复制构造函数,用于对firstlast实例进行深度复制。
  3. 赋值操作符operator=(const firstlast& fl)的重载,它也进行深度复制。

首先,您的insertLast方法会导致内存泄漏,因为您从未实际将新创建的链接的next指针连接到任何东西。您只需重新分配本地指针newlink,该指针随后立即超出作用域。随后的insertLast调用将内存保留在空间中。这也可能导致打印错误。

其次,你的deleteFirst方法实际上并没有删除任何东西,而是在内存中留下一个由new out分配的链接,没有任何指向它的东西。另一个内存泄漏

相关内容

  • 没有找到相关文章

最新更新