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žedeletesa nevolá pri zánikuweak_ptr. -
Pre
std::unique_ptr: ak bol ukazovateľ prevedený alebo presunutý a aktuálnyunique_ptruž 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.