Sobes.tech
Middle

Aký ukazovateľ sa používa spolu s shared_ptr?

sobes.tech AI

Odpoveď od AI

weak_ptr.

#include <memory>
#include <iostream>

int main() {
    auto shared = std::make_shared<int>(10); // Ustvarimo shared_ptr
    std::weak_ptr<int> weak = shared;      // Ustvarimo weak_ptr iz shared_ptr

    if (auto locked = weak.lock()) {       // Poskus pridobivanja shared_ptr iz weak_ptr
        std::cout << "Vrednost: " << *locked << std::endl;
    } else {
        std::cout << "Objekt je izbrisan." << std::endl;
    }

    shared.reset(); // Objekt, na katerega kaže shared_ptr, se izbriše

    if (auto locked = weak.lock()) {       // Ponovni poskus, objekt je že izbrisan
        std::cout << "Vrednost: " << *locked << std::endl;
    } else {
        std::cout << "Objekt je izbrisan." << std::endl;
    }

    return 0;
}

weak_ptr skupaj s shared_ptr se uporablja za reševanje problemov cikličnih referenc in za preprečevanje "memory leak" pri dveh ali več objektih, ki jih upravljata shared_ptr in se medsebojno sklicujejo, in števec referenc nikoli ne doseže nič.

Glavne lastnosti weak_ptr:

  • Ne povečuje števec referenc: weak_ptr hrani "šibko" referenco na objekt, ki ga upravlja shared_ptr, brez povečevanja števca močnih referenc.
  • Preverjanje življenja objekta: Z metodo lock() lahko poskusite pridobiti shared_ptr iz weak_ptr. Če je objekt še živ, bo lock() vrnil veljaven shared_ptr; sicer, prazen shared_ptr.
  • Brez neposrednega dostopa: weak_ptr ne omogoča neposrednega dostopa do vsebine objekta preko operatorjev * ali ->. Dostop je možen le po uspešnem klicu lock().

Uporaba weak_ptr je standardni način za prekinitev ciklov v referencah v podatkovnih strukturah, ki uporabljajo shared_ptr, kot so grafi ali dvostruko povezane sezname.