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:
- 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ą - Kopijavimas: Kopijuojant
shared_ptr, valdymo bloko stiprių nuorodų skaitiklis padidėja 1.std::shared_ptr<int> ptr2 = ptr1; // Padidina stiprių nuorodų skaitiklį - Priskyrimas: Priskiriant
shared_ptrsenam 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 - Pašalinimas: Kai
shared_ptrnaikinamas (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į - Išteklių atlaisvinimas: Kai stiprių nuorodų skaitiklis pasiekia nulį, išteklius (objektas, į kurį nurodo
shared_ptr) ištrinamas naudojant nurodytą ištrynimo funkciją (arbadeletepagal numatytąją). - 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_ptrsprendž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.