Sobes.tech
Middle

Kura norāda kopā ar shared_ptr?

sobes.tech AI

Atbilde no AI

weak_ptr.

#include <memory>
#include <iostream>

int galven() {
    auto kopīgs = std::make_shared<int>(10); // Izveido shared_ptr
    std::weak_ptr<int> vāja = kopīgs;      // Izveido weak_ptr no shared_ptr

    if (auto bloķēts = vāja.lock()) {       // Mēģina iegūt shared_ptr no weak_ptr
        std::cout << "Vērtība: " << *bloķēts << std::endl;
    } else {
        std::cout << "Objekts ir dzēsts." << std::endl;
    }

    kopīgs.reset(); // Objekts, ko pārvalda shared_ptr, tiek dzēsts

    if (auto bloķēts = vāja.lock()) {       // Otrais mēģinājums, objekts jau ir dzēsts
        std::cout << "Vērtība: " << *bloķēts << std::endl;
    } else {
        std::cout << "Objekts ir dzēsts." << std::endl;
    }

    return 0;
}

weak_ptr kopā ar shared_ptr tiek izmantots, lai atrisinātu ciklisko atsauču problēmu un novērstu "atmiņas aizsērēšanu", kad divi vai vairāk objekti, kuri tiek pārvaldīti ar shared_ptr, atsaucas viens uz otru, un atsauču skaitītāji nekad nesasniedz nulli.

Šeit ir galvenās weak_ptr īpašības:

  • Nepaplašina atsauču skaitītāju: weak_ptr glabā "vāju" atsauci uz objektu, ko pārvalda shared_ptr, un tajā pašā laikā nepievieno tai stipro atsauču skaitītāju.
  • Objekta dzīvotspējas pārbaude: Ar lock() metodi var mēģināt iegūt shared_ptr no weak_ptr. Ja objekts joprojām ir dzīvs, lock() atgriezīs derīgu shared_ptr; pretējā gadījumā - tukšu shared_ptr.
  • Tieša piekļuve nav pieejama: weak_ptr nesniedz tiešu piekļuvi objekta saturam ar * vai -> operatoriem. Piekļuve ir iespējama tikai pēc veiksmīgas lock() izsaukšanas.

weak_ptr izmantošana ir standarta veids, kā pārtraukt cikliskas atsauces datu struktūrās, kas izmanto shared_ptr, piemēram, grafos vai divvirziena saistītos sarakstos.