Sobes.tech
Senior

Bir və ya bir neçə obyekt üçün ağıllı göstərici necə həyata keçirilir?

sobes.tech Süni İntellekt

AI-dan cavab

Bir obyekt üçün: unique_ptr və ya shared_ptr. Bir neçə obyekt üçün: shared_ptr (paylaşılan mülkiyyət) və ya weak_ptr (gözətçi, həyat dövrü idarə olunmasında iştirak etmədən).

#include <memory>
#include <vector>

// Obyekt sinfi nümunəsi
class MyObject {
public:
    MyObject() { /* Konstruktor */ }
    ~MyObject() { /* Destructor */ }
};

// Bir obyekt üçün: unique_ptr (yalnız mülkiyyət)
void single_unique_ptr() {
    std::unique_ptr<MyObject> ptr = std::make_unique<MyObject>();
    // Obyekt avtomatik olaraq scope-dan çıxanda silinəcək
}

// Bir obyekt üçün: shared_ptr (paylaşılan mülkiyyət)
void single_shared_ptr() {
    std::shared_ptr<MyObject> ptr = std::make_shared<MyObject>();
    // Sahiblərin sayı artır
    std::shared_ptr<MyObject> another_ptr = ptr;
    // Obyekt, son shared_ptr onu göstərmədikdə silinəcək
}

// Bir neçə obyekt üçün: shared_ptr ilə vektor
void multiple_shared_ptr() {
    std::vector<std::shared_ptr<MyObject>> objects;
    objects.push_back(std::make_shared<MyObject>());
    objects.push_back(std::make_shared<MyObject>());
    // Hər obyekt, vektordakı özünə məxsus shared_ptr tərəfindən idarə olunur
    // Obyektlər, müvafiq shared_ptr-lər silindikdən sonra silinəcək
}

// Bir neçə obyekt üçün: unique_ptr ilə vektor
void multiple_unique_ptr() {
    std::vector<std::unique_ptr<MyObject>> objects;
    objects.push_back(std::make_unique<MyObject>());
    objects.push_back(std::make_unique<MyObject>());
    // Bu halda, vektor unikal göstəricilərə sahibdir
    // Obyektlər, vektor scope-dan çıxanda silinəcək

    // Qeyd: unique_ptr kopyalanmaz, yalnız köçürülə bilər (move)
    std::unique_ptr<MyObject> moved_ptr = std::move(objects[0]);
}

unique_ptrshared_ptr müqayisəsi:

Xüsusiyyət std::unique_ptr std::shared_ptr
Mülkiyyət Yeganə Paylaşılan (referans sayğacı)
Kopyalama Yox (yalnız köçürmə) Bəli
Performans Bir az daha sürətli (referans sayğacı xərcləri olmadan) Bir az daha yavaş (referans sayğacı)
Döngüsel referanslar Qorunmur Xatirə sızmalarına səbəb ola bilər (weak_ptr tələb olunur)

std::weak_ptr shared_ptr tərəfindən idarə olunan obyektə baxmaq üçün istifadə olunur, referans sayğacını artırmadan, döngüsel referans problemlərini qarşısını alır.

#include <memory>

class Node {
public:
    std::shared_ptr<Node> next;
    std::weak_ptr<Node> previous; // Döngüsel referansı qarşısını almaq üçün weak_ptr istifadə olunur

    Node() = default;
    ~Node() { /* Destructor */ }
};

void weak_ptr_example() {
    std::shared_ptr<Node> node1 = std::make_shared<Node>();
    std::shared_ptr<Node> node2 = std::make_shared<Node>();

    node1->next = node2;
    node2->previous = node1; // weak_ptr istifadə olunur

    // weak_ptr-dən shared_ptr əldə etmək və obyektə daxil olmaq mümkündür
    if (auto locked_node = node2->previous.lock()) {
        // Əgər obyekt hələ də mövcuddursa
        // ... locked_node ilə işləyirik
    } else {
        // Obyekt artıq silinib
    }
}