Sobes.tech
Middle

Kaip veikia shared_ptr C++-e?

sobes.tech AI

Atsakymas iš AI

shared_ptr — tai išmanusis rodyklė, įgyvendinanti bendro ištekliaus valdymo semantiką. Ji saugo nuorodą į objektą ir valdymo bloką.

Valdymo blokas apima:

  • Galingų nuorodų skaitiklį (reference count).
  • Silpnų nuorodų skaitiklį (weak count).
  • Naudotojo funkciją ištrynimui (deleter), jei ji nustatyta.
  • Naudotojo atskyriklį, jei jis nustatytas.
  • Nuorodą į saugomą objektą (tas pats, kas saugoma shared_ptr).

Veikimo principas:

  1. Kūrimas: Kai kuriamas pirmasis shared_ptr, rodantis į objektą, kuriamas valdymo blokas, nuorodų skaitikliai inicijuojami: stiprūs — 1, silpni — 0.
    std::shared_ptr<int> ptr1 = std::make_shared<int>(10); // Sukuria int objektą ir valdymo bloką
    
  2. Kopijavimas: Kopijuojant shared_ptr, valdymo bloko stiprių nuorodų skaitiklis padidėja 1.
    std::shared_ptr<int> ptr2 = ptr1; // Padidina stiprių nuorodų skaitiklį
    
  3. Priskyrimas: Priskiriant shared_ptr senam ištekliui, sumažėja (decrement) stiprių nuorodų skaitiklis, o naujam ištekliui — padidėja (increment).
    std::shared_ptr<int> ptr3;
    ptr3 = ptr1; // Sumažina seno ištekliaus skaitiklį, padidina naujo
    
  4. Pašalinimas: Kai shared_ptr naikinamas (pvz., išeina iš matymo srities), stiprių nuorodų skaitiklis mažėja.
    {
        std::shared_ptr<int> ptr4 = ptr1; // Padidina stiprių nuorodų skaitiklį
        // ptr4 išeina iš matymo srities
    } // Sumažina stiprių nuorodų skaitiklį
    
  5. Išteklių atlaisvinimas: Kai stiprių nuorodų skaitiklis pasiekia nulį, išteklius (objektas, į kurį nurodo shared_ptr) ištrinamas naudojant nurodytą ištrynimo funkciją (arba delete pagal numatytąją).
  6. Valdymo bloko atlaisvinimas: Valdymo blokas atlaisvinamas, kai abu skaitikliai (stiprus ir silpnas) pasiekia nulį.

Privalumai:

  • Automatinis atminties valdymas dalijantis ištekliais.
  • Saugumas nuo dvigubo atlaisvinimo.
  • Naudotojo funkcijų palaikymas.

Trūkumai:

  • Ciklinės nuorodos gali sukelti atminties nutekėjimą (weak_ptr sprendžia).
  • Nedidelis papildomas išlaidų padidėjimas dėl valdymo bloko ir atominių operacijų su skaitikliais.
  • Srauto saugumas operacijų su pačiu shared_ptr (kopijavimas, priskyrimas, keitimas), bet ne su objektu, į kurį jis nurodo.