2015-11-06 2 views
-1

Я изучаю C++ и здесь я пытаюсь реализовать функцию pop() стека. Я смущен, когда удалять указатели и как их правильно удалять. Следующий код вызывает ошибку дампа ядра, однако я нашел несколько способов избежать дампа ядра. Проблема в том, что я указываю указатель на другой указатель, и я хочу удалить оба. Если я устанавливаю один на null, я могу удалить оба, но если я укажу один на другой, я не могу удалить оба. Каков соответствующий курс действий здесь и почему я не могу удалить оба, когда один указывает на другой? Кроме того, это не двойной список, и я не отслеживаю второй узел сверху, поэтому мне нужно пройти весь список, чтобы удалить его сверху.Core Dump при удалении указателя C++

Извиняюсь, так как кажется, что этот вопрос часто задают. Существует так много дискуссий, что я не могу разобраться в том, что касается конкретной проблемы.

int List::pop() { 
    int result = -1; 
    if (head != NULL) { 
     result = curr->data; 
     nodePtr delPtr; 
     if (curr == head) { 
      delPtr = head; 
      head = NULL; 
     } 
     else { 
      nodePtr previousNode = head; 
      while(previousNode->next != curr) { 
       previousNode = previousNode->next; 
      } 
      delPtr = curr; 
      curr = previousNode; 
      curr->next = NULL; 
      previousNode = delPtr; //previousNode = NULL;????? 
      delete previousNode;  //unecessary????? 
     } 
    delete delPtr; //Have to delete this one no matter what 
    } 
    else { 
     cout << "The stack is empty" << endl; 
    } 
    return result; 
}//END pop 

ответ

2

Вы удаляете узел curr дважды.

После того, как в этих строках:

previousNode = delPtr; //previousNode = NULL;????? 
delete previousNode;  //unecessary????? 

и один раз в строке:

delete delPtr; //Have to delete this one no matter what 

Вы можете удалить первые две строки.

1

Вы можете удалить обе эти строки:

previousNode = delPtr; //previousNode = NULL;????? 
delete previousNode;  //unecessary????? 

И это будет работать, и будет правильным.

Ошибка при удалении одного и того же указателя дважды. previousNode = delPtr просто делает копию указателя, есть еще один объект.

1

Вам не нужно до delete дважды, вы удаляете только один предмет.

Просто потому, что указатель указывает на что-то не означает, что вы должны указать delete его, если вы измените указатель или он выходит за рамки.

В общем, вам нужно совместить delete с с new s.

Одним словом, вы можете удалить обе свои прокомментированные строки, поскольку у вас уже есть delPtr, предназначенные для удаления.

0
int List::pop() 
{ 
    int result = -1; 
    if (head != NULL) 
    { 
     nodePtr prev = head; 
     nodePtr curr = head; 

     while (curr->next != NULL) 
     { 
      prev = curr; 
      curr = curr->next; 
     } 

     result = curr->data; 
     if (head == curr) 
     { 
      head = NULL; 
     } 
     else 
     { 
      prev->next = NULL; 
     } 

     delete curr; 
    } 
    else 
    { 
     cout << "The stack is empty" << endl; 
    } 
    return result; 
}//END pop