Sobes.tech
Middle

როდის არ გამოიძახება delete ოპერატორი ობიექტისთვის ჭკვიანური მაჩვენებლების შემთხვევაში?

sobes.tech AI

პასუხი AI-სგან

Ақылды көрсеткішпен басқарылатын объект үшін delete операциясы келесі жағдайларда шақырылмайды:

  • std::shared_ptr үшін: егер кемінде басқа shared_ptr сол бір объектіні иеленсе. Жою тек қана сілтемелер саны нөлге жеткенде орын алады.

  • std::weak_ptr үшін: ол объектіге ие емес, тек оған сілтеме жасайды, сондықтан delete weak_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 жойылғаннан кейін шақырылады.