SegFaulting具有出队功能

时间:2013-03-26 02:06:07

标签: c++ linked-list segmentation-fault

基本上,我正在使用链接列表实现队列,以尝试模拟在一天中在商店排队的人,他们等到他们面前的人完成他们的业务。前几个人经历了罚款,但是当我接到第二次出列的电话时,它就让我陷入困境。 gdb调试器说错误来自此行头= current-> next; (其中current = head)。

这是我的出队功能:

    void BankQueue::dequeue()
   {
      Node* current=head;
      head=current->next;
      if(head!=NULL)
      {
            head->prev=NULL;
      }
      delete current;
   }

这是enqueue函数(如果排队我导致内存泄漏):

    void BankQueue::enqueue(Customer s)
    {
         Node* node= new node;
         node->data=s;
         node->next=NULL;
         if(tail==NULL)
         {
              head=node;
              tail=node;
              node->prev=NULL;
         }
         else
         {
              node->prev=tail;
              tail->next=node;;
              tail=node;
         }

你们可以提供任何有关segfault可能发生的帮助将是惊人的,提前感谢。

如果有必要,P.S.I可以提供更多信息。

3 个答案:

答案 0 :(得分:1)

您的dequeue功能存在缺陷。看看如果headNULL会发生什么:

void BankQueue::dequeue()
{
    // current == NULL
    Node* current = head;
    // Setting head to NULL->next
    // This will reference memory location 0x00000000 + (some offset)
    head=current->next;
    // This is undefined, but it most likely will return true
    if(head!=NULL)
    {
        // undefined
        head->prev=NULL;
    }
    // Delete NULL
    delete current;
}

此外,是的,tail也需要更新。

// After you've made sure that head is valid
if (head == tail) {
    // there is only node, so we just clear tail
    tail = NULL;
}
// Then you proceed with removal

托马斯回应你的评论:

void BankQueue::dequeue()
{
    // If the queue has instances
    if (head)
    {
        // If there is only one instance
        if (head == tail)
        {
            tail = NULL;
        }

        // set the new head
        head = head->next;
        // delete the old head if it exists
        if (head->prev)
        {
            delete head->prev;
        }
        // null data
        head->prev = NULL;
    }
}

答案 1 :(得分:0)

我有评论,但我会扩大,因为我认为这很可能是问题。

您的dequeue函数未重置tail指针。因为enqueue函数使用它来确定队列是否为空,所以如果清空队列然后再将项放入其中(因为head将为NULL),则会遇到问题。

答案 2 :(得分:0)

如果(!head)返回,则在dequeue中输入条件;作为第一线。如上所述,您将在此之后设置。