Middle
55
questionbank

Когда в умных указателях не будет вызван оператор delete для объекта?

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

Пример циклической ссылки с shared_ptr:

cpp

Решение с weak_ptr:

cpp