Hoe werkt unique_ptr in C++?
sobes.tech AI
Antwoord van AI
std::unique_ptr — het een slimme pointer die het exclusieve eigendom van een dynamisch toegewezen object implementeert. Het zorgt voor automatisch geheugenbeheer: het object waarnaar unique_ptr wijst, wordt automatisch verwijderd bij vernietiging van unique_ptr.
Belangrijke kenmerken:
- Exclusief eigendom: Op elk moment kan slechts één
unique_ptreen bepaald object bezitten. - Geen kopiëren:
unique_ptrkan niet worden gekopieerd. Dit voorkomt meervoudig eigendom van hetzelfde object en het probleem van "dubbel verwijderen". - Verplaatsingssemantiek: Het eigendom van het object kan worden overgedragen van de ene
unique_ptrnaar de andere met behulp van verplaatsingssemantiek (std::move). - Aanpasbare deleter: Je kunt een eigen deleter opgeven om specifieke manieren van resource vrijmaken te beheren.
Het werkingsprincipe is gebaseerd op RAII (Resource Acquisition Is Initialization): de resource (dynamisch toegewezen geheugen) wordt verworven bij het maken van het object (unique_ptr) en vrijgegeven bij vernietiging.
#include <memory> // Voor unique_ptr
#include <iostream>
class MyClass {
public:
MyClass() { std::cout << "MyClass gemaakt\n"; }
~MyClass() { std::cout << "MyClass verwijderd\n"; }
};
int main() {
{
// Creëer een unique_ptr die een MyClass-object bezit
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();
// Op dit moment is ptr1 de exclusieve eigenaar van het object
// auto ptr2 = ptr1; // Fout: kopiëren is verboden
// Eigendom overdragen van ptr1 naar ptr2
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
// Na de verplaatsing bezit ptr1 geen object meer (is nullptr)
if (!ptr1) {
std::cout << "ptr1 bezit geen object: " << (ptr1 ? "Ja" : "Nee") << "\n";
}
// Het bereik van ptr2 eindigt hier.
// ptr2 wordt vernietigd, en het MyClass-object dat het bezit, wordt automatisch verwijderd.
} // Het MyClass-object wordt hier verwijderd
std::cout << "Einde main.\n";
return 0;
}
Vergelijking met raw pointer:
| Kenmerk | raw pointer |
std::unique_ptr |
|---|---|---|
| Eigendom van resource | Niet gedefinieerd | Exclusief |
| Automatisch verwijderen | Nee | Ja |
| Semantiek van kopiëren | Ja | Nee (alleen verplaatsen) |
| Risico op geheugenlek | Hoog | Laag |
Over het algemeen is unique_ptr de voorkeursmethode voor het beheren van dynamisch geheugen in C++11 en hoger, vooral wanneer strikte eigendom en automatische vrijgave van resources vereist zijn.