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_ptr və shared_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
}
}