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

Оператор delete для объекта, управляемого умным указателем, не будет вызван в следующих случаях:

Короткий ответ

Что ответить на собеседовании

Оператор delete для объекта, управляемого умным указателем, не будет вызван в следующих случаях:

Подробный разбор

Ответ с пояснениями

Оператор delete для объекта, управляемого умным указателем, не будет вызван в следующих случаях:

  • Для std::shared_ptr: если существует хотя бы один другой shared_ptr, владеющий этим же объектом. Удаление происходит только когда счетчик ссылок достигает нуля.
  • Для std::weak_ptr: он не владеет объектом, а лишь ссылается на него, поэтому delete не вызывается при уничтожении weak_ptr.
  • Для std::unique_ptr: если указатель был передан или перемещён, и текущий unique_ptr больше не владеет объектом.
  • Если умный указатель был создан с кастомным делитером, который не вызывает delete (например, освобождает ресурс другим способом).

Пример с std::shared_ptr:

#include <memory>
#include <iostream>

struct Foo {
    ~Foo() { std::cout << "Foo destroyed\n"; }
};

int main() {
    std::shared_ptr<Foo> sp1(new Foo());
    {
        std::shared_ptr<Foo> sp2 = sp1; // счетчик ссылок = 2
    } // sp2 уничтожается, счетчик = 1, delete не вызывается
    // delete вызовется только когда sp1 будет уничтожен
}

Здесь delete вызовется только после уничтожения последнего shared_ptr.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку