首页 > 解决方案 > 使用链表从双端队列中删除最后一个节点时避免内存泄漏

问题描述

对于我的作业,我需要创建从 Deque 中添加(附加)和删除(服务)节点的方法。但是,在尝试为最后一个节点提供服务时,我遇到了内存泄漏问题,因为我不知道如何检索系统不再使用的节点。这是该方法的代码。

void Deque::serveAtRear(int &x)
{
  if(empty())
  {
      cout << "Fila Vazia" << endl;
      exit(0);
  }
  else
  {
      DequePointer q;         //Pointer before p
      q = head;               //q starts at the deque's head
      p = head->nextNode;     //Pointer for the next node

      if(q->nextNode==NULL)   //If there's only one node
      {
         x = q->entry;        //x will receive the value of the removed node to print it afterward
         head = tail = NULL;
         delete p;            //I don't know if I'm using the "delete" right
      }
      else
      {
         while(p->nextNode != NULL)
         {
             p = p->nextNode;
             q = q->nextNode;
             if(p->nextNode==NULL)
             {
                 q->nextNode=NULL;
             }
         }
         x = p->entry;
         delete p->nextNode;
     }
     delete q->nextNode;
  }

}

要添加节点,我有这个方法:

void Deque::appendAtFront(int x)
{

  if(full())
  {
     cout << "FULL" << endl;
     exit(0);
  }
  else
  {
     p = new DequeNode;
     p->entry=x;
     if(p == NULL)
     {
         cout << "Can't insert" << endl;
         exit(0);
     }
     else if(empty())
     {
         head = tail = p;
         p->nextNode=NULL;
     }
     else
     {
         p->nextNode=head;
         head = p;
     }
  }
}

我也不能使用“deque”库

标签: c++memory-leakslinked-listdeque

解决方案


如何避免泄漏的一般答案是:避免手动分配内存。

例如,您可以使用智能指针,例如std::unique_ptr,而不是调用new DequeNodecall std::make_unique<DequeNode>()。然后编译器会指出你的代码需要调整的地方,因为你会限制自己,这样你的每个 DequeNode(s) 将同时由一个unique_ptr 拥有。基于您的serveAtRear的示例弹出函数(其中head和是uniuque_ptrs):DequeNode.next

if (!head)
{
    return;
}
DequeNode* q;          //Pointer before p 
DequeNode* p;          //will be tail eventually 
q = head.get();        //q starts at the deque's head 
p = q->next.get();     //Pointer for the next node 

if(!p)   //If there's only one node 
{       
        x = q->entry; //x will receive the value of the removed node to print it afterward 
        head.reset(); // hear we release DequeNode pointed by head
}       
else    
{       
        while(p->next) 
        {       
                q = p;  
                p = q->next.get(); 
        }       
        x = p->entry; 
        q->next.reset(); // here we release tail (i.e. p)
}       

当然也需要采用推送的实现:)。


推荐阅读