Junior
225
Welke slimme pointers zijn er in C++?
Antwoord van AI
sobes.tech AI
std::unique_ptr, std::shared_ptr, std::weak_ptr.
-
std::unique_ptr:- Exclusief eigendom van het object.
- Kan niet worden gekopieerd, maar kan worden verplaatst (
std::move). - Verwijdert automatisch het object bij het verlaten van de scope of bij vernietiging van
unique_ptr. - Is lichtgewicht, zonder extra kosten voor de referentieteller.
#include <memory> // Creëren van een unique_ptr std::unique_ptr<int> up1(new int(10)); // Eigendom verplaatsen std::unique_ptr<int> up2 = std::move(up1); // up1 is nu nullptr // up2 bezit het object -
std::shared_ptr:- Gedeeld eigendom van het object.
- Gebruikt een referentieteller om bij te houden hoeveel
shared_ptrnaar de bron wijzen. - Het object wordt verwijderd wanneer de laatste
shared_ptrdie ernaar wijst wordt vernietigd. - Kan worden gekopieerd en verplaatst.
- Heeft extra kosten voor de referentieteller (meestal apart gealloceerd).
- Kan cyclische referenties vormen, wat leidt tot geheugenlekken.
#include <memory> // Creëren van een shared_ptr std::shared_ptr<int> sp1 = std::make_shared<int>(20); // Kopiëren van eigendom std::shared_ptr<int> sp2 = sp1; // Referentieteller wordt verhoogd // sp1 en sp2 bezitten het object -
std::weak_ptr:- Bezit het object niet.
- Vertegenwoordigt een "zwakke" verwijzing naar het object, beheerd door één of meerdere
shared_ptr. - Wordt gebruikt om cyclische referenties tussen
shared_ptrte voorkomen. - Verhoogt de referentieteller niet.
- Om veilig toegang te krijgen tot het object, moet het worden geconverteerd naar
shared_ptrmet behulp van delock()-methode. Als het object al is verwijderd, geeftlock()een legeshared_ptrterug.
#include <memory> // Creëren van een shared_ptr std::shared_ptr<int> sp = std::make_shared<int>(30); // Creëren van een weak_ptr uit een shared_ptr std::weak_ptr<int> wp = sp; // Controle en gebruik van het object if (auto shared_from_weak = wp.lock()) { // Toegang tot het object via shared_from_weak } else { // Het object is al verwijderd }