基本上,我正在使用链接列表实现队列,以尝试模拟在一天中在商店排队的人,他们等到他们面前的人完成他们的业务。前几个人经历了罚款,但是当我接到第二次出列的电话时,它就让我陷入困境。 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可以提供更多信息。答案 0 :(得分:1)
您的dequeue
功能存在缺陷。看看如果head
为NULL
会发生什么:
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)