Sobes.tech
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:

  1. 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
    
  2. 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
    
  3. Pievienošana: Pievienojot shared_ptr vecajam 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
    
  4. Noņemšana: Kad shared_ptr tiek 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
    
  5. 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 (vai delete pēc noklusējuma).
  6. 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_ptr risinā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.