Sobes.tech
Назад к вопросам
Middle
152

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

Ответ от нейросети

sobes.tech AI

Оператор 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.