Middle
როდის არ გამოიძახება delete ოპერატორი ობიექტისთვის ჭკვიანური მაჩვენებლების შემთხვევაში?
sobes.tech AI
პასუხი AI-სგან
Ақылды көрсеткішпен басқарылатын объект үшін delete операциясы келесі жағдайларда шақырылмайды:
-
std::shared_ptrүшін: егер кемінде басқаshared_ptrсол бір объектіні иеленсе. Жою тек қана сілтемелер саны нөлге жеткенде орын алады. -
std::weak_ptrүшін: ол объектіге ие емес, тек оған сілтеме жасайды, сондықтанdeleteweak_ptrжойылғанда шақырылмайды. -
std::unique_ptrүшін: егер көрсеткіш берілген немесе орын ауыстырылған болса және ағымдағыunique_ptrобъектіге ие болмаса. -
Егер ақылды көрсеткіш арнайы deleter-пен жасалған болса және ол
deleteшақырмаса (мысалы, ресурс басқа жолмен босатылады).
std::shared_ptr мысалы:
#include <memory>
#include <iostream>
struct Foo {
~Foo() { std::cout << "Foo жойылды\n"; }
};
int main() {
std::shared_ptr<Foo> sp1(new Foo());
{
std::shared_ptr<Foo> sp2 = sp1; // сілтеме саны = 2
} // sp2 жойылады, сілтеме саны = 1, delete шақырылмайды
// delete тек соңғы `shared_ptr` жойылғанда шақырылады
}
Мұнда, delete тек соңғы shared_ptr жойылғаннан кейін шақырылады.