Junior
Ի՞նչ խելացի ցուցիչներ կան C++-ում։
sobes.tech AI
Պատասխան AI-ից
std::unique_ptr, std::shared_ptr, std::weak_ptr.
-
std::unique_ptr:- Անհատական սեփականություն օբյեկտի համար:
- Չի կարող պատճենվել, բայց կարող է տեղափոխվել (
std::move): - Ավտոմատ կերպով ջնջում է օբյեկտը, երբ դուրս է գալիս տեսադաշտից կամ ոչնչացվում է
unique_ptr: - Հեշտ է, առանց հղման հաշվիչի ավելորդ ծախսերի:
#include <memory> // `unique_ptr` ստեղծում std::unique_ptr<int> up1(new int(10)); // Հեղափոխում սեփականությունը std::unique_ptr<int> up2 = std::move(up1); // up1 այժմ nullptr // up2 տիրապետում է օբյեկտին -
std::shared_ptr:- Կիսասեփականություն օբյեկտի:
- Օգտագործում է հղման հաշվիչ՝ հետևելու համար, թե քանի
shared_ptrէ հղում ռեսուրսին: - Օբյեկտը ջնջվում է, երբ վերջին
shared_ptr-ը այն ոչնչացվում է: - Կարող է պատճենվել և տեղափոխվել:
- Հղման հաշվիչի համար ավելորդ ծախսեր ունի (հատկապես առանձին ամրագրում):
- Կարող է առաջանալ ցիկլային հղումներ, որոնք հանգեցնում են հիշողության լքման:
#include <memory> // `shared_ptr` ստեղծում std::shared_ptr<int> sp1 = std::make_shared<int>(20); // Հավաքական սեփականություն std::shared_ptr<int> sp2 = sp1; // Հղման հաշվիչը մեծանում է // sp1 և sp2 տիրապետում են օբյեկտին -
std::weak_ptr:- Չի տիրապետում օբյեկտին:
- Ներկայացնում է "թույլ" հղում օբյեկտին, որը կառավարում է մի կամ մի քանի
shared_ptr: - Օգտագործվում է ցիկլային հղումների կանխարգելման համար:
- Չի ավելացնում հղման հաշվիչը:
- Անվտանգ մուտք գործելու համար պետք է փոխակերպել
shared_ptr-ի՝lock()մեթոդով: - Եթե օբյեկտը արդեն ջնջված է,
lock()կվերադարձնի դատարկshared_ptr:
#include <memory> // `shared_ptr` ստեղծում std::shared_ptr<int> sp = std::make_shared<int>(30); // `weak_ptr` ստեղծում `shared_ptr`-ից std::weak_ptr<int> wp = sp; // Օգտագործում և ստուգում if (auto shared_from_weak = wp.lock()) { // Օբյեկտին մուտք } else { // Օբյեկտը արդեն ջնջված է }