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:
- 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 - Kopeerimine: Kopeerimisel
shared_ptr, juhtimisbloki tugevate viidete loendur suureneb ühe võrra.std::shared_ptr<int> ptr2 = ptr1; // Suurendab tugevate viidete loendurit - Määramine: Määrates
shared_ptrvanale 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 - Eemaldamine: Kui
shared_ptrhä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 - Ressursi vabastamine: Kui tugevate viidete loendur jõuab nulli, ressurss (objekt, millele
shared_ptrosutab) kustutatakse kasutades määratud kustutaja funktsiooni (võideletevaikimisi). - 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_ptrlahendus). - 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.