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_ptrglabā "vāju" atsauci uz objektu, ko pārvaldashared_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ūtshared_ptrnoweak_ptr. Ja objekts joprojām ir dzīvs,lock()atgriezīs derīgushared_ptr; pretējā gadījumā - tukšushared_ptr. - Tieša piekļuve nav pieejama:
weak_ptrnesniedz tiešu piekļuvi objekta saturam ar*vai->operatoriem. Piekļuve ir iespējama tikai pēc veiksmīgaslock()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.