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 outroshared_ptrque 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, portantodeletenão é chamado na destruição doweak_ptr. -
Para
std::unique_ptr: se o ponteiro foi transferido ou movido, e ounique_ptratual 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.