Middle
Kā darbojas shared_ptr C++?
sobes.tech AI
Atbilde no AI
shared_ptr — tas ir gudrs norādotājs, kas realizē koplieto resursa īpašības semantiku. Tas glabā norādi uz objektu un vadības bloku.
Vadības bloks satur:
- Spēcīgo norāžu skaitītāju (reference count).
- Vāju norāžu skaitītāju (weak count).
- Lietotāja funkciju dzēšanai (deleter), ja tā ir norādīta.
- Lietotāja atdalītāju, ja tas ir norādīts.
- Norādi uz glabāto objektu (tas pats, kas glabājas
shared_ptr).
Darba princips:
- Izveide: Pirmā
shared_ptr, kas norāda uz objektu, tiek izveidots vadības bloks, norāžu skaitītāji tiek inicializēti: spēcīgi — 1, vāji — 0.std::shared_ptr<int> ptr1 = std::make_shared<int>(10); // Izveido int objektu un vadības bloku - Kopēšana: Kopējot
shared_ptr, vadības bloka spēcīgo norāžu skaitītājs palielinās par 1.std::shared_ptr<int> ptr2 = ptr1; // Palielina spēcīgo norāžu skaitītāju - Pievienošana: Pievienojot
shared_ptrvecajam resursam, samazina (decrement) spēcīgo norāžu skaitītāju, jauniem — palielina (increment).std::shared_ptr<int> ptr3; ptr3 = ptr1; // Samazina vecā resursa skaitītāju, palielina jauno - Noņemšana: Kad
shared_ptrtiek iznīcināts (piemēram, iziet no redzes loka), spēcīgo norāžu skaitītājs samazinās.{ std::shared_ptr<int> ptr4 = ptr1; // Palielina spēcīgo norāžu skaitītāju // ptr4 iziet no redzes loka } // Samazina spēcīgo norāžu skaitītāju - Resursa atbrīvošana: Kad spēcīgo norāžu skaitītājs sasniedz nulli, resursu (objektu, uz kuru norāda
shared_ptr) izdzēš, izmantojot norādīto dzēšanas funkciju (vaideletepēc noklusējuma). - Vadības bloka atbrīvošana: Vadības bloks tiek atbrīvots, kad abi skaitītāji (spēcīgais un vājais) sasniedz nulli.
Priekšrocības:
- Automātiska atmiņas pārvaldība dalītajiem resursiem.
- Drošība pret dubultu atbrīvošanu.
- Lietotāja funkciju atbalsts.
Trūkumi:
- Ciklisks norādes var novest pie atmiņas noplūdes (
weak_ptrrisinājums). - Nedaudz papildu izmaksas vadības blokam un atomu operācijām ar skaitītājiem.
- Strāvas drošība operācijām ar pašu
shared_ptr(kopēšana, piešķiršana, maiņa), bet ne ar objektu, uz kuru tas norāda.