C++ da Smart Pointerlar

Bu sayfa henüz Türkçe diline çevrilmedi — orijinal (Özbekçe) metin gösteriliyor.


Smart Pointerlar - bu dynamically allocated memoryʼni avtomatik boshqaruvchi obyektlar hisblanadi. Ular **C++ Standard Library** tomonidan taqdim etiladi va dinamik yaratilgan obyektlarning lifetime’ini boshqarishga yordam beradi.

  • Agar boshqarilayotgan obyekt qaytib kerak bölmaydigan bölsa, unga tegishli xotirani avtomatik ravishda bo‘shatadi.
  • Memory leak va dangling pointer kabi xotira bilan bog‘liq muammolarni kamaytirishga yordam beradi.
  • C++ Standard Library’dagi <memory> headeri std::unique_ptr, std::shared_ptr va std::weak_ptr kabi smart pointerʼlarni taqdim etadi.

misol: Raw Pointer bilan yuzzaga keladigan muammo (Memory leakʼga misol)

cpp
#include <iostream>using namespace std;int main() {    int* ptr = new int(10);    cout << *ptr;    // delete ptr; // -> xotirani bo'shatish uchun talab qilinadi    return 0;}

Natija:

10

Tushuntirish:

  • new int(10) xotiradan dinamik ravishda joy ajratadi va unga 10 qiymatini yozadi.
  • Ajratilgan xotira delete orqali aniq bo‘shatilmaguncha band holatda qoladi.
  • delete chaqirishni unutish memory leak yuzaga kelishiga olib kelishi mumkin.
  • Smart pointerlar esa bunday xotirani avtomatik boshqarishga yordam beradi.

Smart Pointerʼlarning sintaksi

Smart pointerlar template class hisoblanadi. Shu sababli ular boshqaradigan obyekt turi burchakli qavslar (<,>) ichida ko‘rsatiladi.

smart_pointer_type<data_type> pointer_name;

Masalan:

unique_ptr<int> ptr;shared_ptr<int> ptr;weak_ptr<int> ptr;

Smart Pointerlarning turlari

C++ uchta keng tarqalgan smart pointerʼlarni taqdim etadi:

1. auto_ptr (eskirgan)

auto_ptr — C++ dagi dastlabki smart pointerʼlardan biri bo‘lib, boshqarayotgan obyektini scope’idan chiqqanda avtomatik ravishda o‘chirardi.

  • Ownership boshqa pointerga ko‘chiriladi, natijada asl pointer bo‘sh (null) holatda qoladi.
  • Uning copy semantics xatti-harakati xavfli va xatolarga moyil hisoblanadi.
c++ da auto pointerlar
cpp
#include <iostream>#include <memory>using namespace std;int main() {    auto_ptr<int> ptr1(new int(10));    cout << *ptr1 << endl;    auto_ptr<int> ptr2 = ptr1;  // ownership transfer    cout << *ptr2;    return 0;}