Kiedy w inteligentnych wskaźnikach nie zostanie wywołany operator delete dla obiektu?
sobes.tech AI
Odpowiedź od AI
Operacja delete dla obiektu zarządzanego przez inteligentny wskaźnik nie zostanie wywołana w następujących przypadkach:
-
Dla
std::shared_ptr: jeśli istnieje co najmniej innyshared_ptrposiadający ten sam obiekt. Usunięcie następuje tylko wtedy, gdy licznik odwołań osiągnie zero. -
Dla
std::weak_ptr: nie posiada obiektu, a jedynie na niego wskazuje, więcdeletenie jest wywoływane podczas niszczeniaweak_ptr. -
Dla
std::unique_ptr: jeśli wskaźnik został przekazany lub przeniesiony, a obecnyunique_ptrnie posiada już obiektu. -
Jeśli inteligentny wskaźnik został utworzony z niestandardowym deleterem, który nie wywołuje
delete(np. zwalnia zasób w inny sposób).
Przykład z std::shared_ptr:
#include <memory>
#include <iostream>
struct Foo {
~Foo() { std::cout << "Foo zniszczony\n"; }
};
int main() {
std::shared_ptr<Foo> sp1(new Foo());
{
std::shared_ptr<Foo> sp2 = sp1; // licznik odwołań = 2
} // sp2 jest niszczony, licznik = 1, delete nie jest wywoływane
// delete zostanie wywołane tylko gdy sp1 również zostanie zniszczony
}
Tutaj delete zostanie wywołane tylko po zniszczeniu ostatniego shared_ptr.