Sobes.tech
Middle

¿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 otro shared_ptr que 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 que delete no se llama al destruir el weak_ptr.

  • Para std::unique_ptr: si el puntero fue transferido o movido, y el unique_ptr actual 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.