查看以下行:while(node->next!= nullptr)
。这段代码给了我一个严重的分配错误。
但是,将其更改为while(node!= nullptr)
时,它运行良好。有人可以解释为什么会发生此错误吗?
void deleteNode(SNode <Object>* & node, Object given)
{
SNode <Object>* temp= node;
if(node->data== given)
{
node= node->next;
delete temp;
temp= nullptr;
}
while(temp->next!= nullptr) //this the problematic line
{
if(temp->next->data== given)
{
SNode<Object>* t= temp->next;
temp->next= temp->next->next;
delete t;
t= nullptr;
}
temp= temp->next;
}
}
答案 0 :(得分:2)
变量temp
可能是nullptr
,因此当您尝试访问它时,next
成员会崩溃。
一种解决方案是将该行更改为while(temp != nullptr && temp->next!= nullptr)
,以解决崩溃问题。
答案 1 :(得分:0)
问题可能出在这里:
if(node->data== given)
{
node= node->next;
delete temp;
temp= nullptr;
}
temp
现在可能是nullptr
。尝试访问nullptr
的成员将导致您的程序崩溃。
最简单的解决方案是在代码中添加else:
SNode <Object>* temp= node;
if(node->data== given)
{
node= node->next;
delete temp;
temp= nullptr;
} else {
while(temp->next!= nullptr) //this the problematic line
{
if(temp->next->data== given)
{
SNode<Object>* t= temp->next;
temp->next= temp->next->next;
delete t;
t= nullptr;
}
temp= temp->next;
}
}
尽管,由于任何原因,如果节点是nullptr
,那仍然会导致程序崩溃,因此,无论如何,最好还是先检查temp
:
SNode <Object>* temp= node;
if(node->data== given)
{
node= node->next;
delete temp;
temp= nullptr;
}
if(temp != nullptr) {
while(temp->next!= nullptr) //this the problematic line
{
if(temp->next->data== given)
{
SNode<Object>* t= temp->next;
temp->next= temp->next->next;
delete t;
t= nullptr;
}
temp= temp->next;
}
}
这具有即使将nullptr
传递到函数开头也不会崩溃的优点。