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 kitasshared_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ėldeletenebus iškviestas, kaiweak_ptrbus sunaikintas. -
std::unique_ptr: jei rodyklė buvo perduota arba perkelta, ir dabartinisunique_ptrnevaldo 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.