为什么这行代码会产生错误?

时间:2019-06-22 18:00:27

标签: c++ data-structures

查看以下行: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;
    }
}

2 个答案:

答案 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传递到函数开头也不会崩溃的优点。