Мы могли бы использовать shared_ptr
до next
и weak_ptr
до prev
, но не два weak_ptr
. Если нет shared_ptr
, указывающего на узел, счетчик ссылок становится равным нулю, а weak_ptr
становится nullptr
.
В любом случае, использование shared_ptr
для связанных списков является излишним. Поскольку только один объект владеет узлом (головой или предыдущим узлом), подойдет простой unique_ptr
для next
с необработанным указателем на prev
.
Обратите внимание, что использование умных указателей сопряжено с риском для связанных списков. Проблема возникает, когда длинный список разрушается, он разрушается рекурсивно. Деструктор узла вызывает деструктор умного указателя, который вызывает деструктор узла. Скорее всего, stacj будет расти в O (n). Поскольку список может быть длиннее максимально возможного стека, код может исчерпать пространство стека и вызвать сбой .
Это не означает, что умные указатели не могут быть использованы, только то, что узел должен реализовывать деструктор. Деструктор должен стирать узлы в цикле, чтобы рекурсия не вызывалась.