unique_ptr или shared_ptr, если указатель обнулен (ptr = nullptr) до того, как он вышел из области видимости или счетчик ссылок обнулился.shared_ptr, если есть циклические ссылки между объектами, владеющими shared_ptr, что предотвращает обнуление счетчика ссылок. В этом случае помогает использование weak_ptr для одной из сторон цикла.shared_ptr в функцию или метод по неконстантной ссылке (shared_ptr&) и последующем изменении указателя внутри этой функции/метода (например, присвоение nullptr), владение может быть утрачено, но объект может не быть удален, если существуют другие shared_ptr на этот объект.shared_ptr или unique_ptr, если деструктор объекта бросает исключение. В этом случае поведение неопределено.unique_ptr или shared_ptr, который не выполняет операцию delete для объекта.Пример циклической ссылки с shared_ptr:
cpp
Решение с weak_ptr:
cpp