Я обычно не использую умные указатели при реализации контейнеров, как вы показываете.Необработанные указатели (imho) не , которых следует избегать, как чумы.Используйте умный указатель, когда вы хотите обеспечить владение памятью.Но обычно в контейнере контейнер владеет памятью, на которую указывают указатели, составляющие структуру данных.
Если в вашем проекте AVLTreeNode
уникально владеет своими левым и правым потомками, и вы хотите выразить этос unique_ptr
это нормально.Но если вы предпочитаете, чтобы AVLTree
владел всеми AVLTreeNode
с и делал это с необработанными указателями, это также верно (и так я обычно кодирую).
Поверьте мне, я 'не анти-смарт-указатель.Я тот, кто изобрел unique_ptr
.Но unique_ptr
- это просто еще один инструмент в наборе инструментов.Наличие хороших умных указателей в ящике для инструментов не является панацеей, и использование их вслепую для всего не заменяет тщательного проектирования.
Обновление для ответа на комментарий (поле для комментариев былослишком маленький):
Я часто использую сырые указатели (которыми редко владею).Хорошая выборка моего стиля кодирования существует в проекте с открытым исходным кодом libc ++ .Можно просмотреть исходный код по ссылке «Обзор SVN».
Я предпочитаю, чтобы каждое выделение ресурса могло быть где-то освобождено в деструкторе из-за проблем безопасности исключений, даже если обычное освобождение происходит за пределамидеструктор.Когда выделение принадлежит одному указателю, интеллектуальный указатель обычно является наиболее удобным инструментом в наборе инструментов.Когда выделение принадлежит чему-то большему, чем указатель (например, контейнер или класс Employee
), необработанные указатели часто являются удобной частью структуры данных, составляющей объект большего размера.
Самая важная вещьв том, что я никогда не выделяю какой-либо ресурс, не зная, какому объекту принадлежит этот ресурс, будь то умный указатель, контейнер или что-то еще.