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-и дуруст медиҳад; дар ғайри ҳол,shared_ptrхолӣ. - Бе дастрасии мустақим:
weak_ptrдастрасии мустақим ба мазмуни объектро тавассути операторҳои*ё->намедиҳад. Дастрасӣ танҳо пас аз даъвати муваффақиlock()имконпазир аст.
Истифодаи weak_ptr роҳи стандартӣ барои шикастани гирдоби ишораҳо дар сохторҳои додаҳое мебошад, ки shared_ptr-ро истифода мебаранд, масалан, графҳо ё рӯйхатҳои дутарафа.