使用链表从双端队列中删除最后一个节点时避免内存泄漏

Avoid memory leak when removing last node from deque using linkd list

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

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" 图书馆

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

例如,您可以使用智能指针,例如std::unique_ptr 而不是调用 new DequeNode 调用 std::make_unique<DequeNode>()。然后编译器将指出您的代码需要调整的地方,因为您将限制自己,以便您的每个 DequeNode(s) 将仅由 one unique_ptr 在同时。基于您的 serveAtRear:

的弹出函数示例(其中 headDequeNode.next 是 uniuque_ptrs)
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)
}       

当然push的实现也需要采用:).