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žedeletenení voláno při zánikuweak_ptr. -
Pro
std::unique_ptr: pokud byl ukazatel předán nebo přesunut a aktuálníunique_ptrjiž 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.