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_ptrstd::shared_ptrstd::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_ptrarası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_ptr-ıshared_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.