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 ոչնչացվելուց հետո։