программа иногда падает - PullRequest
1 голос
/ 12 марта 2011

Ожидается, что следующая подпрограмма удалит узел в начале единого связанного списка, но иногда происходит сбой.

void remove_from_front(node *start)
{
    delete start;
    start = start->link;
    print_list(start);
}

Ответы [ 3 ]

8 голосов
/ 12 марта 2011

Есть несколько проблем, которые я вижу:

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

  2. Ваша функция должна внести изменения в начало списка, но она не делает изменения видимыми для вызываемогофункция, поскольку она ничего не возвращает, а аргумент start передается по значению.Чтобы исправить это, либо передайте адрес или ссылку указателя start.

  3. Ваша функция может быть вызвана в пустом списке, start = NULL.Вам нужно разобраться с этим делом.

Правильная реализация:

void remove_from_front(node **start) {

  // if list is empty..nothing to remove..return.
  if(*start == NULL) {
     return;
  }

  // save the address of the node following the start in new_start 
  node *new_start = (*start)->link;

  // now delete the start node.
  delete *start;

 // new_start is now the new start of the list.
 // And since start was passed by address, the change is reflected in the
 // calling function.
  *start = new_start;
}
5 голосов
/ 12 марта 2011

Как только вы delete start, вы не можете безопасно использовать кусочки того, на что start указывал. Это все равно, что отпустить веревку кайта и ожидать, что она сможет завладеть ею позже - это может сработать, а может и нет.

0 голосов
/ 12 марта 2011

Вы удаляете начало, а затем пытаетесь разыменовать его, получив ссылку на него. Это потерпит крах, потому что вы только что удалили его. Вы, вероятно, хотите что-то вроде этого:

node *temp = start;
start = start->link;
delete temp;
print_list(start);
...