Sobes.tech
Junior

Kādi ir gudrie norādītāji C++?

sobes.tech AI

Atbilde no AI

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

  • std::unique_ptr:

    • Ekskluzīva objekta īpašība.
    • Nav kopējams, bet var tikt pārvietots (std::move).
    • Automātiski iznīcina objektu, izejot no redzes lauka vai iznīcinot unique_ptr.
    • Viegls, bez papildu izmaksām saistīto skaitītāju.
    #include <memory>
    
    // `unique_ptr` izveide
    std::unique_ptr<int> up1(new int(10));
    
    // Īpašuma pārvietošana
    std::unique_ptr<int> up2 = std::move(up1);
    
    // up1 tagad nullptr
    // up2 pārvalda objektu
    
  • std::shared_ptr:

    • Kopīgs objekta pārvaldījums.
    • Izmanto atsauču skaitītāju, lai uzraudzītu, cik shared_ptr norāda uz resursu.
    • Objekts tiek iznīcināts, kad pēdējais shared_ptr to iznīcina.
    • Var kopēt un pārvietot.
    • Tam ir papildu izmaksas atsauču skaitītājam (parasti atsevišķi piešķirts).
    • Var rasties cikliskas atsauces, kas noved pie atmiņas noplūdes.
    #include <memory>
    
    // `shared_ptr` izveide
    std::shared_ptr<int> sp1 = std::make_shared<int>(20);
    
    // Kopēšana
    std::shared_ptr<int> sp2 = sp1; // Atsauču skaitītājs palielinās
    
    // sp1 un sp2 pārvalda objektu
    
  • std::weak_ptr:

    • Nevalda objektu.
    • Attēlo "vāju" norādi uz objektu, ko pārvalda viens vai vairāki shared_ptr.
    • Izmanto ciklisku norāžu novēršanai starp shared_ptr.
    • Nepalielina atsauču skaitītāju.
    • Lai droši piekļūtu objektam, nepieciešams pārveidot uz shared_ptr ar lock() metodi. Ja objekts jau ir izdzēsts, lock() atgriezīs tukšu shared_ptr.
    #include <memory>
    
    // `shared_ptr` izveide
    std::shared_ptr<int> sp = std::make_shared<int>(30);
    
    // `weak_ptr` izveide no `shared_ptr`
    std::weak_ptr<int> wp = sp;
    
    // Pārbaude un izmantošana
    if (auto shared_from_weak = wp.lock()) {
        // Pieeja objektam
    } else {
        // Objekts jau ir izdzēsts
    }