Sobes.tech
Middle

Quando os operadores delete não forem chamados para um objeto em apontadores inteligentes?

sobes.tech IA

Resposta da IA

A operação delete para um objeto gerido por um ponteiro inteligente não será chamada nos seguintes casos:

  • Para std::shared_ptr: se existir pelo menos outro shared_ptr que possua o mesmo objeto. A eliminação ocorre apenas quando o contador de referências atinge zero.

  • Para std::weak_ptr: ele não possui o objeto, apenas faz referência a ele, portanto delete não é chamado na destruição do weak_ptr.

  • Para std::unique_ptr: se o ponteiro foi transferido ou movido, e o unique_ptr atual já não possui o objeto.

  • Se o ponteiro inteligente foi criado com um deleter personalizado que não chama delete (por exemplo, libera o recurso de outra forma).

Exemplo com std::shared_ptr:

#include <memory>
#include <iostream>

struct Foo {
    ~Foo() { std::cout << "Foo destruído\n"; }
};

int main() {
    std::shared_ptr<Foo> sp1(new Foo());
    {
        std::shared_ptr<Foo> sp2 = sp1; // contador de referências = 2
    } // sp2 é destruído, contador = 1, delete não é chamado
    // delete só será chamado quando sp1 também for destruído
}

Aqui, delete só será chamado após a destruição do último shared_ptr.