Назад к вопросам
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.