Sobes.tech
Middle

C++-də ağıllı göstəricilər haqqında nə bilirsiniz?

sobes.tech Süni İntellekt

AI-dan cavab

Ağıllı göstəricilər, C++-də adi (xam) göstəricilər üzərində RAII-çərçivələrdir və ayrılmış yaddaşın həyat müddətini avtomatik idarə edir, sızmaları qarşısını alır.

C++ standart kitabxanasında əsas ağıllı göstərici növləri:

  • std::unique_ptr
  • std::shared_ptr
  • std::weak_ptr

std::unique_ptr

  • Resursu müstəsna olaraq idarə edir.
  • Kopyalanmaz, lakin köçürülə bilər.
  • Resursun unikal mülkiyyəti üçün istifadə olunur.
  • Əlavə xərclər minimaldir, xam göstəriciyə bərabərdir.
// unique_ptr nümunəsi
#include <memory>
#include <iostream>

int main() {
    std::unique_ptr<int> ptr = std::make_unique<int>(10);
    std::cout << *ptr << std::endl; // 10
    // std::unique_ptr<int> ptr2 = ptr; // Yığım xətası: unique_ptr kopyalanmaz
    std::unique_ptr<int> ptr3 = std::move(ptr); // Mülkiyyətin köçürülməsi
    std::cout << *ptr3 << std::endl; // 10
    // std::cout << *ptr << std::endl; // Təyin olunmamış davranış: indi ptr boşdur
    return 0;
}

std::shared_ptr

  • Bir neçə göstərici resursu birlikdə idarə edə bilər.
  • Referans sayğacı istifadə edir. Sayğac sıfıra çatanda yaddaş sərbəst buraxılır.
  • Kopyalanabilir. Hər kopya referans sayğacını artırır.
  • unique_ptr-ə nisbətən daha yüksək xərclər, sayğacın idarə olunması üçün.
// shared_ptr nümunəsi
#include <memory>
#include <iostream>

int main() {
    std::shared_ptr<int> ptr1 = std::make_shared<int>(20);
    std::cout << *ptr1 << " (use_count: " << ptr1.use_count() << ")" << std::endl; // 20 (use_count: 1)
    std::shared_ptr<int> ptr2 = ptr1; // Kopya, use_count artır
    std::cout << *ptr1 << " (use_count: " << ptr1.use_count() << ")" << std::endl; // 20 (use_count: 2)
    std::shared_ptr<int> ptr3 = ptr1; // Yana kopya
    std::cout << *ptr1 << " (use_count: " << ptr1.use_count() << ")" << std::endl; // 20 (use_count: 3)
    return 0;
}

std::weak_ptr

  • Resursu idarə etmir və referans sayğacını artırmır.
  • shared_ptr arasında döngüvi referansların qarşısını almaq üçün istifadə olunur.
  • shared_ptr-ın göstərdiyi resursa giriş imkanı verir, lakin onun silinməsinə mane olmur.
  • Resursa giriş üçün, weak_ptrshared_ptr-a çevirmək lazımdır, lock() metodundan istifadə etməklə.
// weak_ptr nümunəsi
#include <memory>
#include <iostream>

int main() {
    std::shared_ptr<int> shared_ptr_int = std::make_shared<int>(30);
    std::weak_ptr<int> weak_ptr_int = shared_ptr_int;

    if (auto locked_ptr = weak_ptr_int.lock()) {
        std::cout << *locked_ptr << std::endl; // 30
    } else {
        std::cout << "Resurs sərbəst buraxılıb." << std::endl;
    }

    shared_ptr_int.reset(); // Resurs sərbəst buraxılır

    if (auto locked_ptr = weak_ptr_int.lock()) {
        std::cout << *locked_ptr << std::endl;
    } else {
        std::cout << "Resurs sərbəst buraxılıb." << std::endl; // Resurs sərbəst buraxılıb.
    }
    return 0;
}

Ağıllı göstəricilərdən istifadə müasir C++-da yaxşı təcrübə hesab olunur, çünki bu, yaddaş idarəetmə xətalarının ehtimalını əhəmiyyətli dərəcədə azaldır.