Sobes.tech
Middle

Kuidas töötab shared_ptr C++-s?

sobes.tech AI

Vastus AI-lt

shared_ptr — see on nutikas näitaja, mis rakendab jagatud ressursi omandi semantikat. See hoiab objekti näitaja ja juhtimisbloki.

Juhtimisblokk sisaldab:

  • Tugevate viidete loendur (reference count).
  • Nõrkade viidete loendur (weak count).
  • Kasutaja funktsioon kustutamiseks (deleter), kui see on määratud.
  • Kasutaja eraldaja, kui see on määratud.
  • Näitaja hoitava objekti kohta (see on sama, mis hoitakse shared_ptr-s).

Tööpõhimõte:

  1. Loomine: Kui luuakse esimene shared_ptr, mis viitab objekti, luuakse juhtimisblokk, viidete loendurid initsialiseeritakse: tugevad — 1, nõrgad — 0.
    std::shared_ptr<int> ptr1 = std::make_shared<int>(10); // Loob int objekti ja juhtimisbloki
    
  2. Kopeerimine: Kopeerimisel shared_ptr, juhtimisbloki tugevate viidete loendur suureneb ühe võrra.
    std::shared_ptr<int> ptr2 = ptr1; // Suurendab tugevate viidete loendurit
    
  3. Määramine: Määrates shared_ptr vanale ressursile, vähendatakse (decrement) tugevate viidete loendurit, uuele ressursile suurendatakse (increment).
    std::shared_ptr<int> ptr3;
    ptr3 = ptr1; // Vähendab vana ressursi loendurit, suurendab uut
    
  4. Eemaldamine: Kui shared_ptr hävitatakse (näiteks, väljaspool vahemikku), vähendatakse tugevate viidete loendurit.
    {
        std::shared_ptr<int> ptr4 = ptr1; // Suurendab tugevate viidete loendurit
        // ptr4 väljub vahemikust
    } // Vähendab tugevate viidete loendurit
    
  5. Ressursi vabastamine: Kui tugevate viidete loendur jõuab nulli, ressurss (objekt, millele shared_ptr osutab) kustutatakse kasutades määratud kustutaja funktsiooni (või delete vaikimisi).
  6. Juhtimisbloki vabastamine: Juhtimisblokk vabastatakse, kui mõlemad loendurid (tugev ja nõrk) jõuavad nulli.

Eelised:

  • Automaatne mälu haldamine jagatud ressursside jaoks.
  • Ohutus topeltvabastamise eest.
  • Kasutaja funktsioonide tugi.

Miinused:

  • Tsüklilised viited võivad põhjustada mälu lekked (weak_ptr lahendus).
  • Väike lisakulu juhtimisbloki ja atomaarsete operatsioonide tõttu loenduritega.
  • Tõrkeohutus operatsioonidel shared_ptr-iga (kopeerimine, määramine, muutmine), kuid mitte objekti suhtes, millele see osutab.