2014-09-05 5 views
0

Я понимаю, это, вероятно, очень простой вопрос, но тем не менее, если у вас есть очень простой связанный список в C++ что-то вроде этого ...Удаление связанного списка следующий указатель в C++

class link{ 
    link * next; 
    ~link(void){ 
     delete next; 
    } 

} 

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

+0

вам не нужно «удалять следующий» в деструкторе ссылки. – NetVipeC

ответ

1

Все просто. Если у вас есть класс, например link тогда, когда вы создаете объект этого типа с помощью оператора нового того constrauctor из ссылки называется

link *node = new link; 

При удалении объекта, созданном с помощью нового, то его деструктора

delete node; 

В вашем примере next - это тот же объект типа link (указатель на объект, созданный с помощью оператора new) в качестве объекта, который его удерживает. Таким образом, его деструктор будет вызываться, когда к нему применяется оператор delete.

0

Да, кроме того, что следующий является частным, поэтому никогда не может быть установлен ничем (у вас нет методов или друзей) , и если у вас будут ссылки, которые вытекают из ссылки, деструктор должен быть виртуальным, поэтому правильный код (а не просто ссылка :: ~ link вызывается удалением). вам нужно удалить следующее, потому что это указатель на экземпляр объекта. без удаления, ничего не получится (деструктор указателя не удаляет объект, на который указывает указатель).

1

Да, деструктор объекта вызывается при его удалении. Поэтому в этой реализации все узлы (или ссылки, если вы предпочитаете) после удаляемого узла также будут уничтожены.

0

Удалить вызов деструктора подлежащего удалению и освобождает память впоследствии. Поэтому, если у вас есть связанный список (без циклов) и удалить голову, он освободит полный список.

Смежные вопросы