Երբ է խելացի ցուցիչներում չի կանչվի 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 ոչնչացվելուց հետո։