Sobes.tech
Middle

unique_ptr дар C++ чӣ гуна кор мекунад?

sobes.tech AI

Ҷавоб аз AI

std::unique_ptr — интуиран ишоратгари аст, ки соҳибияти истисноии объектҳои динамикӣ-таъиншударо амалӣ мекунад. Вай идораи автоматии хотираро таъмин мекунад: объекте, ки ба unique_ptr ишора мекунад, худ ба худ ҳангоми нобуд кардани unique_ptr нест карда мешавад.

Хусусиятҳои асосӣ:

  • Иштибоҳии соҳибият: Дар ҳар лаҳза танҳо як unique_ptr метавонад соҳиби объект бошад.
  • Нест кардани нусхабардорӣ: unique_ptr наметавонад нусхабардорӣ шавад. Ин пешгирӣ мекунад соҳибияти бисёрмавзӯъро ба як объект ва мушкилоти "дукаратаи нест кардан".
  • Маънои интиқол: Соҳибият ба объект метавонад аз unique_ptr ба дигар тавассути маънои интиқол (std::move) гузарад.
  • Идораи тозакунанда: Мумкин аст, тозакунандаи худсохт (deleter) барои идораи роҳҳои махсуси озод кардани захираҳо пешниҳод шавад.

Принсипи кор дар асоси RAII (Resource Acquisition Is Initialization): захира (хотираи динамикӣ-тарҳрезишуда) дар вақти эҷоди объект (unique_ptr) ба даст оварда мешавад ва дар вақти нобудӣ озод карда мешавад.

#include <memory> // Барои unique_ptr
#include <iostream>

class MyClass {
public:
    MyClass() { std::cout << "MyClass эҷод шуд\n"; }
    ~MyClass() { std::cout << "MyClass нест шуд\n"; }
};

int main() {
    {   
        // Эҷоди unique_ptr, ки соҳиби объект MyClass аст
        std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(); 
        
        // Дар ин лаҳза, ptr1 соҳиби ягонаи объект аст
        // auto ptr2 = ptr1; // Хатогии компилятор: нусхабардорӣ манъ аст

        // интиқоли соҳибият аз ptr1 ба ptr2
        std::unique_ptr<MyClass> ptr2 = std::move(ptr1); 
        
        // Пас аз интиқол, ptr1 дигар соҳиби объект нест (ба nullptr табдил ёфт)
        if (!ptr1) {
            std::cout << "ptr1 соҳиби объект нест: " << (ptr1 ? "Бале" : "Не") << "\n";
        }

        // Маҳалли тамоюл барои ptr2 ба охир мерасад.
        // ptr2 нест карда мешавад ва объект MyClass, ки соҳиби он аст, автоматӣ нест карда мешавад.
    } // Объект MyClass дар ин ҷо нест карда мешавад

    std::cout << "Охир main.\n";

    return 0;
}

Мувофиқати бо raw pointer:

Хусусият raw pointer std::unique_ptr
Владеенство дар захира Нақша накарда шудааст Иштибоҳӣ
Автоматии нест кардан Не Бале
Маънои нусхабардорӣ Бале Не (фақат интиқол)
Ҳодисаҳои хотираҳо Риск баланд Риск паст

Ҳамагӣ, unique_ptr роҳи беҳтарини идораи хотираи динамикӣ дар C++11 ва версияҳои баъдӣ барои ҳолатҳое мебошад, ки талаботи қатъии соҳибият ва озодкунии автоматӣ зарур аст.