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, მაგალითად გრაფებს ან ორმაგად დაკავშირებულ სია-თ.