Умный указатель удаляет стек из-за рекурсивного удаления - PullRequest
5 голосов
/ 20 августа 2011

Простые структуры данных, например, связанные списки, где указатель «следующий» является умным указателем. Когда головной узел удаляется, включается умный указатель для «следующего» и выполняет рекурсивное удаление. Для длинного списка это быстро уносит стек.

Мне пришлось вернуться, чтобы заменить эти умные указатели на простые, необработанные указатели. Я что-то здесь упускаю?

Ответы [ 2 ]

5 голосов
/ 20 августа 2011

Предполагая, что я вас правильно понял, и оба head и next являются умными указателями, вы можете избежать этого, выполнив:

head = head->next;

или эквивалентный.Ваша «старая» голова будет удалена, а старый второй предмет будет повышен до головы.Все в одном последовательном изменении, без глубокой рекурсии.Единственным предварительным условием для этого является то, что заголовок не должен начинаться с NULL.

Как отметил Майк в комментарии, если целью является удаление всего списка, вы можете повторить это в цикле.

2 голосов
/ 20 августа 2011

Умные указатели на внутренности класса связанного списка, кажется, не очень-то вас покупают.Сырые указатели кажутся мне совершенно разумными.Я думаю, что умные указатели лучше всего использовать для менее контролируемых ситуаций, в которых было бы легко забыть удалить что-либо.

Имейте в виду, что у вас был огромный список, чтобы взорвать стек, вы уверены, что у вас нетошибка в вашем коде?

...