记录一下,不好好使用指针的坏处
void LinkQueue<ElemType>::pop(ElemType& e)
{
if (!Empty()&&front->next!=rear)
{
node<ElemType>* tem = front->next;
e = tem->data;
front->next = tem->next;
delete tem;
}
else if (!Empty() && front->next == rear)
{
e = rear->data;
delete rear;
//front->next = nullptr;
rear = front;
}
else
{
cout << "队列空" << endl;
}
}
初看,是不是没毛病,但是,,有一个非常可怕的事,就是第二个if中,当我们释放了rear后,front->next还指向rear,这个就很不好了,因为这个rear这个指针已经被释放掉了,也就是不更新front->next为nullptr,那么就会导致后面错误的判空,继而引用已经原地去世了的rear指针。
所以无论什么时候,一定要,一定要记得更新front->next
下面给出一个安全的一批还简单的版本
void LinkQueue<ElemType>::pop(ElemType& e)
{
if (!Empty())
{
node<ElemType>* tem = front->next;
e = tem->data;
front->next = tem->next;
if (tem == rear)
{
rear = front;
}
delete tem;
}
else
{
cout << "队列空" << endl;
}
}