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