Sobes.tech
Middle

shared_ptr ilə birlikdə hansı göstərici istifadə olunur?

sobes.tech Süni İntellekt

AI-dan cavab

weak_ptr.

#include <memory>
#include <iostream>

int main() {
    auto shared = std::make_shared<int>(10); // Paylaşılan göstərici yaradılır
    std::weak_ptr<int> weak = shared;      // shared_ptr-dən weak_ptr yaradılır

    if (auto locked = weak.lock()) {       // weak_ptr-dən shared_ptr almağa cəhd
        std::cout << "Dəyər: " << *locked << std::endl;
    } else {
        std::cout << "Obyekt silinib." << std::endl;
    }

    shared.reset(); // shared_ptr-in göstərdiyi obyekt silinir

    if (auto locked = weak.lock()) {       // Yenidən cəhd, obyekt artıq silinib
        std::cout << "Dəyər: " << *locked << std::endl;
    } else {
        std::cout << "Obyekt silinib." << std::endl;
    }

    return 0;
}

weak_ptrshared_ptr birlikdə istifadə edilərək dövrü referanslar problemi həll edilir və yaddaş sarkması qarşısı alınır, xüsusən iki və ya daha çox shared_ptr tərəfindən idarə olunan obyektlərin bir-birinə istinad etdiyi hallarda, və referans sayğacı heç vaxt sıfıra çatmır.

Əsas weak_ptr xüsusiyyətləri:

  • Güclü referans sayğacını artırmır: weak_ptr shared_ptr tərəfindən idarə olunan obyektə "zəif" istinad saxlayır, və onun güclü referans sayğacını artırmır.
  • Obyektin həyat dövrünün yoxlanması: lock() metodu ilə weak_ptr-dən shared_ptr almağa çalışılır. Əgər obyekt hələ də mövcuddursa, lock() etibarlı shared_ptr qaytarır; əks halda, boş shared_ptr.
  • Birbaşa giriş yoxdur: weak_ptr *-> operatorları ilə obyektin məzmununa birbaşa giriş təmin etmir. Giriş yalnız lock() çağırışından sonra mümkündür.

weak_ptr istifadəsi, shared_ptr istifadə edən məlumat strukturlarında referans döngülərini qırmaq üçün standart bir yoldur, məsələn, qrafiklər və ya ikili bağlı siyahılar kimi.