Sobes.tech
Middle

Kada išmaniuosiuose rodyklėse nebus iškviestas delete operatorius objektui?

sobes.tech AI

Atsakymas iš AI

Išmanusis rodyklis valdoma objekto delete operacija nebus iškviesta šiais atvejais:

  • std::shared_ptr: jei yra bent vienas kitas shared_ptr, valdantis tą patį objektą. Ištrynimas įvyksta tik tada, kai nuorodų skaitiklis pasiekia nulį.

  • std::weak_ptr: jis nevaldo objekto, tik jį nuorodo, todėl delete nebus iškviestas, kai weak_ptr bus sunaikintas.

  • std::unique_ptr: jei rodyklė buvo perduota arba perkelta, ir dabartinis unique_ptr nevaldo objekto.

  • Jei išmanusis rodyklis buvo sukurtas su pritaikytu deleteriu, kuris nekviečia delete (pavyzdžiui, atlaisvina išteklių kitaip).

Pavyzdys su std::shared_ptr:

#include <memory>
#include <iostream>

struct Foo {
    ~Foo() { std::cout << "Foo sunaikintas\n"; }
};

int main() {
    std::shared_ptr<Foo> sp1(new Foo());
    {
        std::shared_ptr<Foo> sp2 = sp1; // nuorodų skaitiklis = 2
    } // sp2 sunaikinamas, nuorodų skaitiklis = 1, `delete` nebus iškviestas
    // `delete` bus iškviestas tik tada, kai ir sp1 bus sunaikintas
}

Čia delete bus iškviestas tik po paskutinio shared_ptr sunaikinimo.