Sobes.tech
Middle

რა იცით C++-ში ჭკვიანი მაჩვენებლების შესახებ?

sobes.tech AI

პასუხი AI-სგან

Акылдуу көрсөткүчтөр - бул RAII-оболочкалар, C++теги адаттагы (жарандатуучу) көрсөткүчтөрдүн үстүнө коюлган, автоматтык түрдө бөлүнгөн эс тутумдун жашоо мөөнөтүн башкарууга мүмкүндүк берүүчү, агып кетүүнү алдын алат.

C++ стандарт китепканасындагы негизги түрлөрү:

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

std::unique_ptr

  • Ресурсту эксклюзивдүү ээлик кылат.
  • Көчүрүлө албайт, бирок которулушу мүмкүн.
  • Ресурсту уникалдуу ээлик кылуу үчүн колдонулат.
  • Чыгымдары минималдуу, жалаң жалаң көрсөткүчкө барабар.
// уникалдуу көрсөткүч мисалы
#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; // Компиляция ката: unique_ptr көчүрүлбөйт
    std::unique_ptr<int> ptr3 = std::move(ptr); // ээлик кылууну которуу
    std::cout << *ptr3 << std::endl; // 10
    // std::cout << *ptr << std::endl; // Нерегулярдуу жүрүм-турум: ptr азыр бош
    return 0;
}

std::shared_ptr

  • Бир ресурсту бир нече көрсөткүч бирдей ээлик кыла алат.
  • Ссылка санагычты колдонуп, эс тутум бошотулат, эгер ал нөлгө жетсе.
  • Мүмкүн болсо, көчүрүлө алат. Ар бир көчүрүү ссылка санагычты көбөйтөт.
  • unique_ptrке салыштырмалуу көбүрөөк чыгымдарга ээ, ссылка санагычты башкаруу үчүн.
// бөлүштүрүлгөн көрсөткүч мисалы
#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; // көчүрүү, use_count көбөйөт
    std::cout << *ptr1 << " (use_count: " << ptr1.use_count() << ")" << std::endl; // 20 (use_count: 2)
    std::shared_ptr<int> ptr3 = ptr1; // дагы бир көчүрүү
    std::cout << *ptr1 << " (use_count: " << ptr1.use_count() << ")" << std::endl; // 20 (use_count: 3)
    return 0;
}

std::weak_ptr

  • Ресурсту ээлик кылбайт жана ссылка санагычты көбөйтпөйт.
  • shared_ptr ортосундагы циклик шилтемелердин көйгөйүн чечүү үчүн колдонулат.
  • shared_ptr көрсөтүп турган ресурска жетүүгө мүмкүндүк берет, бирок анын жоголушуна тоскоолдук кылбайт.
  • Ресурска жетүү үчүн, weak_ptr shared_ptrке айландыруу керек, lock() методу аркылуу.
// weak_ptr мисалы
#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 << "Ресурс алынып салынды." << std::endl;
    }

    shared_ptr_int.reset(); // Ресурс бошотулат

    if (auto locked_ptr = weak_ptr_int.lock()) {
        std::cout << *locked_ptr << std::endl;
    } else {
        std::cout << "Ресурс алынып салынды." << std::endl; // Ресурс алынып салынды
    }
    return 0;
}

Заманбап C++-да акылдуу көрсөткүчтөрдү колдонуу жакшы практика болуп саналат, анткени ал эс тутумду башкарууда каталардын мүмкүнчүлүгүн азайтат.