Почему эта строка кода выдает ошибку? - PullRequest
0 голосов
/ 22 июня 2019

Посмотрите на строку: while(node->next!= nullptr).Этот код дает мне ошибочную ошибку alloc.

Однако, когда он изменяется на 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 ]

2 голосов
/ 22 июня 2019

Переменная temp, вероятно, nullptr, поэтому при попытке доступа к ней next происходит сбой члена.

Одним из решений является изменение этой строки на while(temp != nullptr && temp->next!= nullptr), чтобы исправить ошибку.

0 голосов
/ 22 июня 2019

Потенциально, проблема заключается в следующем:

    if(node->data== given)
    {
        node= node->next;
        delete temp;
        temp= nullptr;
    }

temp теперь возможно nullptr. Попытка получить доступ к члену nullptr приведет к сбою вашей программы.

Самое простое решение - добавить еще один код:

    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 передается в функцию для начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...