Sobes.tech
Middle

Дар бораи ишораҳои зеҳнӣ дар C++ чӣ медонед?

sobes.tech AI

Ҷавоб аз AI

Индикаторҳои зеҳнӣ - ин RAII-обгӯишҳо дар боло аз нишондиҳандаҳои оддӣ (хом) дар C++, ки идоракунии автоматии вақти зиндагии хотираи тақсимшударо таъмин мекунанд, ва аз ройгонӣ пешгирӣ мекунанд.

Типҳои асосии нишондиҳандаҳои зеҳнӣ дар китобхонаи стандартии C++:

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

std::unique_ptr

  • Манбаи захираро ба таври эксклюзивӣ доро мебошад.
  • Нест метавонад нусхабардорӣ шавад, аммо метавонад интиқол дода шавад.
  • Барои соҳибии ягонаи манба истифода мешавад.
  • Хароҷотҳо каманд, баробар бо нишондиҳандаи хом.
// намунаи 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, бо сабаби идоракунии ҳисобкунак.
// намунаи shared_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-ро бо истифода аз усули lock() ба shared_ptr табдил дод.
// намунаи 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++-и муосир амалияи хуб аст, зеро он хатогиҳои идоракунии хотираро хеле кам мекунад.