Middle
Ի՞նչ ցուցիչ է օգտագործվում shared_ptr- ի հետ։
sobes.tech AI
Պատասխան AI-ից
weak_ptr.
#include <memory>
#include <iostream>
int main() {
auto shared = std::make_shared<int>(10); // Ստեղծում ենք shared_ptr
std::weak_ptr<int> weak = shared; // Ստեղծում ենք weak_ptr shared_ptr-ից
if (auto locked = weak.lock()) { // Փորձում ենք ստանալ shared_ptr-ից weak_ptr
std::cout << "Արժեքը: " << *locked << std::endl;
} else {
std::cout << "Օբյեկտը ջնջված է." << std::endl;
}
shared.reset(); // Օբյեկտը, որի վրա ցույց է տալիս shared_ptr-ը, ջնջվում է
if (auto locked = weak.lock()) { // Երկրորդ փորձը, օբյեկտը արդեն ջնջված է
std::cout << "Արժեքը: " << *locked << std::endl;
} else {
std::cout << "Օբյեկտը ջնջված է." << std::endl;
}
return 0;
}
weak_ptr-ը համատեղ օգտագործվում է shared_ptr-ի հետ՝ ցիկլային հղումներն լուծելու և հիշողության լիքները կանխելու համար, երբ երկու կամ ավելի օբյեկտներ, որոնք կառավարում են shared_ptr, հղում են միմյանց, և հղումների հաշվիչները երբեք չեն հասնում զրոյի։
Հիմնական հատկությունները weak_ptr-ի:
- Չավելացնում է հղումների հաշվիչը:
weak_ptrպահպանում է «թույլ» հղումshared_ptr`-ով կառավարվող օբյեկտին, առանց ավելացնելու նրա «ուժեղ» հղումների հաշվիչը: - Օբյեկտի կյանքի ժամկետի ստուգում:
lock()մեթոդով կարելի է փորձել ստանալshared_ptr-ըweak_ptr-ից։ Եթե օբյեկտը դեռ կենդանի է,lock()վերադարձնում է վավերshared_ptr; հակառակ դեպքում՝ դատարկ: - Առանց ուղղակի մուտքի:
weak_ptrչի ապահովում ուղղակի մուտք օբյեկտի պարունակությանը*կամ->օպերատորների միջոցով։ Մուտքը հնարավոր է միայնlock()-ի հաջող զանգի դեպքում:
weak_ptr-ի օգտագործումը ստանդարտ միջոց է ցիկլային հղումներն ընդհատելու համար տվյալների կառուցվածքներում, որոնք օգտագործում են shared_ptr, օրինակ՝ գրաֆներում կամ երկկողմ կապակցված ցանկերում։