Sobes.tech
Middle

Kedy sa nevolá operátor delete pre objekt v inteligentných ukazovateľoch?

sobes.tech AI

Odpoveď od AI

Operácia delete pre objektu spravovanom chytrým ukazovateľom sa nebude volať v týchto prípadoch:

  • Pre std::shared_ptr: ak existuje aspoň jeden ďalší shared_ptr, ktorý vlastní ten istý objekt. Vymazanie nastáva iba vtedy, keď počet odkazov dosiahne nulu.

  • Pre std::weak_ptr: nevlastní objekt, iba naň odkazuje, takže delete sa nevolá pri zániku weak_ptr.

  • Pre std::unique_ptr: ak bol ukazovateľ prevedený alebo presunutý a aktuálny unique_ptr už nevlastní objekt.

  • Ak bol chytrý ukazovateľ vytvorený s vlastným deleterom, ktorý nevolá delete (napríklad uvoľňuje zdroj iným spôsobom).

Prí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 odkazov = 2
    } // sp2 je zničený, počet = 1, delete sa nevolá
    // delete bude volaný až keď bude zničený aj sp1
}

Tu bude delete volaný až po zničení posledného shared_ptr.