У меня есть реализация связанного списка, в которой у меня есть класс LinkedList
, содержащий член с именем head_
, который является указателем на LinkedListNode
. LinkedListNode
, очевидно, содержит член с именем next_
, который я могу использовать для перехода по списку.
У меня есть деструктор ~LinkedList
, который начинается с head_
и проходит по списку delete
- все указатели на LinkedListNode
по ходу:
~LinkedList() {
LinkedListNode *thru = head_;
while (thru != nullptr) {
LinkedListNode* toDelete = thru;
thru = thru->next;
delete toDelete;
toDelete = nullptr; // LINE *
}
Все работает нормально. Мой вопрос о том, что произошло, когда я подумал, что буду в безопасности, и вставлю деструктор для класса LinkedListNode, например:
~LinkedListNode() {
if (next_ != nullptr) // LINE **
delete next_;
}
Это вызывает ошибку переполнения стека, которая, как я предполагаю, потому что я пытаюсь удвоить delete
указатели next_
, один раз из LinkedList
и один раз из LinkedListNode
.
Мой вопрос: не следует устанавливать указатель toDelete
на nullptr
в строке (*), плюс проверка if()
в строке (**), предотвратить ошибку двойного удаления?