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() әдісі арқылы shared_ptr-ке айналдыру керек. Егер объект жойылған болса, lock() бос shared_ptr қайтарады.
    #include <memory>
    
    // shared_ptr құру
    std::shared_ptr<int> sp = std::make_shared<int>(30);
    
    // weak_ptr құру
    std::weak_ptr<int> wp = sp;
    
    // Объектіге тексеру және пайдалану
    if (auto shared_from_weak = wp.lock()) {
        // Объектіге қол жеткізу
    } else {
        // Объект жойылған
    }