Sobes.tech
Junior

Ի՞նչ խելացի ցուցիչներ կան C++-ում։

sobes.tech AI

Պատասխան AI-ից

std::unique_ptr, std::shared_ptr, std::weak_ptr.

  • std::unique_ptr:

    • Անհատական սեփականություն օբյեկտի համար:
    • Չի կարող պատճենվել, բայց կարող է տեղափոխվել (std::move):
    • Ավտոմատ կերպով ջնջում է օբյեկտը, երբ դուրս է գալիս տեսադաշտից կամ ոչնչացվում է unique_ptr:
    • Հեշտ է, առանց հղման հաշվիչի ավելորդ ծախսերի:
    #include <memory>
    
    // `unique_ptr` ստեղծում
    std::unique_ptr<int> up1(new int(10));
    
    // Հեղափոխում սեփականությունը
    std::unique_ptr<int> up2 = std::move(up1);
    
    // up1 այժմ nullptr
    // up2 տիրապետում է օբյեկտին
    
  • std::shared_ptr:

    • Կիսասեփականություն օբյեկտի:
    • Օգտագործում է հղման հաշվիչ՝ հետևելու համար, թե քանի shared_ptr է հղում ռեսուրսին:
    • Օբյեկտը ջնջվում է, երբ վերջին shared_ptr-ը այն ոչնչացվում է:
    • Կարող է պատճենվել և տեղափոխվել:
    • Հղման հաշվիչի համար ավելորդ ծախսեր ունի (հատկապես առանձին ամրագրում):
    • Կարող է առաջանալ ցիկլային հղումներ, որոնք հանգեցնում են հիշողության լքման:
    #include <memory>
    
    // `shared_ptr` ստեղծում
    std::shared_ptr<int> sp1 = std::make_shared<int>(20);
    
    // Հավաքական սեփականություն
    std::shared_ptr<int> sp2 = sp1; // Հղման հաշվիչը մեծանում է
    
    // sp1 և sp2 տիրապետում են օբյեկտին
    
  • std::weak_ptr:

    • Չի տիրապետում օբյեկտին:
    • Ներկայացնում է "թույլ" հղում օբյեկտին, որը կառավարում է մի կամ մի քանի shared_ptr:
    • Օգտագործվում է ցիկլային հղումների կանխարգելման համար:
    • Չի ավելացնում հղման հաշվիչը:
    • Անվտանգ մուտք գործելու համար պետք է փոխակերպել shared_ptr-ի՝ lock() մեթոդով:
    • Եթե օբյեկտը արդեն ջնջված է, lock() կվերադարձնի դատարկ shared_ptr:
    #include <memory>
    
    // `shared_ptr` ստեղծում
    std::shared_ptr<int> sp = std::make_shared<int>(30);
    
    // `weak_ptr` ստեղծում `shared_ptr`-ից
    std::weak_ptr<int> wp = sp;
    
    // Օգտագործում և ստուգում
    if (auto shared_from_weak = wp.lock()) {
        // Օբյեկտին մուտք
    } else {
        // Օբյեկտը արդեն ջնջված է
    }