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 гана чакырылат, sp1 дагы жок кылынганда
}

Бул жерде, delete акыркы shared_ptr жок кылынгандан кийин гана чакырылат.