Проблема с null

не могу понять почему выдает ошибку и я не могу выйти из цикла while в функции task, на одной из итераций в цикле for в отладчике пишет ошибку - task было nullptr, но у меня в условии написано что при nullptr нужно выйти. что не так понять не могу. код не полный, для общего понимания вырвал куски.

class list
{
public:
    list(int size);
    ~list();
    void task();
    void start(char data);
    void add(char data);
    void show();
    void del(int pos);
    struct node
    {
        char data;
        node* next;
        node* prev;
    };
private:
    node* head;
    node* tail;
    int size;
};
void list::task()
{
    for (int i = 0; i < size; i++)
    {
        node *task = head;
        char ss = '*';
        while(task->data != ss|| task != nullptr)
        {
            task = task->next;
        }
        if (task->data == ss)
        {
            node* deltask = task->prev;
            node* prevtask = task->prev;
            node* aftertask = task->next;
            prevtask = prevtask->prev;
            aftertask->prev = prevtask;
            prevtask->next = aftertask;
            delete deltask;
            delete task;
        }
    }

}
int main()
{
first.task();
cout << "Результирующий список : ";
first.show();
return 0
}

Ответы (1 шт):

Автор решения: Harry

Может, не "или", а "и"? Потому что при task == nullptr выхода все равно нет, вернее, есть аварийный — при попытке разыменовать нулевой указатель.

Чтобы его не разыменовывать (представьте, что у вас уже task — нулевой... и вы начинаете искать task->data), надо правильно расставить операнды ||, чтобы воспользоваться сокращенным вычислением:

while(task != nullptr && task->data != ss)

или, еще проще,

while(task && task->data != ss)

По тем же соображениям о разыменовании следующая проверка должна быть не

if (task->data == ss)

а

if (task)
→ Ссылка