¿Cuándo en los punteros inteligentes no se llamará al operador delete para el objeto?
sobes.tech AI
Respuesta de la IA
La operación delete para un objeto gestionado por un puntero inteligente no se llamará en los siguientes casos:
-
Para
std::shared_ptr: si existe al menos otroshared_ptrque posea el mismo objeto. La eliminación solo ocurre cuando el contador de referencias alcanza cero. -
Para
std::weak_ptr: no posee el objeto, solo hace referencia a él, por lo quedeleteno se llama al destruir elweak_ptr. -
Para
std::unique_ptr: si el puntero fue transferido o movido, y elunique_ptractual ya no posee el objeto. -
Si el puntero inteligente fue creado con un deleter personalizado que no llama a
delete(por ejemplo, libera el recurso de otra manera).
Ejemplo con std::shared_ptr:
#include <memory>
#include <iostream>
struct Foo {
~Foo() { std::cout << "Foo destruido\n"; }
};
int main() {
std::shared_ptr<Foo> sp1(new Foo());
{
std::shared_ptr<Foo> sp2 = sp1; // contador de referencias = 2
} // sp2 se destruye, contador = 1, delete no se llama
// delete solo se llamará cuando sp1 también sea destruido
}
Aquí, delete solo se llamará después de que el último shared_ptr sea destruido.