Sobes.tech
Middle

როგორ მუშაობს unique_ptr C++-ში?

sobes.tech AI

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

std::unique_ptr — бул акылдуу көрсөтүүчү, ал динамикалык бөлүнгөн объекттин эксклюзивдүү ээлигин ишке ашырат. Ал автоматтык эс тутумду башкарууну камсыз кылат: 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 жана андан кийинки версияларда колдонулат, эгерде катуу ээлик жана автоматтык бошотуу талап кылынса.