Sobes.tech
Middle
188

Kdy nebude v chytrých ukazatelích volán operátor delete pro objekt?

Odpověď od AI

sobes.tech AI

Operace delete pro objekt, který je spravován chytrým ukazatelem, nebude volána v následujících případech:

  • Pro std::shared_ptr: pokud existuje alespoň jeden jiný shared_ptr, který vlastní stejný objekt. Smazání nastává pouze tehdy, když počet odkazů dosáhne nuly.

  • Pro std::weak_ptr: nevlastní objekt, pouze na něj odkazuje, takže delete není voláno při zániku weak_ptr.

  • Pro std::unique_ptr: pokud byl ukazatel předán nebo přesunut a aktuální unique_ptr již nevlastní objekt.

  • Pokud byl chytrý ukazatel vytvořen s vlastním deleterem, který nevolá delete (například uvolňuje zdroj jiným způsobem).

Příklad s std::shared_ptr:

#include <memory>
#include <iostream>

struct Foo {
    ~Foo() { std::cout << "Foo zničen\n"; }
};

int main() {
    std::shared_ptr<Foo> sp1(new Foo());
    {
        std::shared_ptr<Foo> sp2 = sp1; // počet odkazů = 2
    } // sp2 je zničeno, počet odkazů = 1, delete není voláno
    // delete bude voláno až když bude zničeno i sp1
}

Zde bude delete voláno až po zničení posledního shared_ptr.