Middle
Kako funkcioniše unique_ptr u C++?
sobes.tech АИ
Одговор од АИ
std::unique_ptr — to je pametna pokazivač koja implementira isključivo vlasništvo nad dinamički alociranim objektom. Osigurava automatsko upravljanje memorijom: objekat na koji ukazuje unique_ptr automatski se briše pri uništenju unique_ptr.
Ključne osobine:
- Isključivo vlasništvo: U bilo kom trenutku, samo jedan
unique_ptrmože posedovati određeni objekat. - Nepostojanje kopiranja:
unique_ptrse ne može kopirati. To sprečava višestruko vlasništvo nad istim objektom i problem "duplog brisanja". - Semantika pomeranja: Vlasništvo nad objektom može biti preneto sa jednog
unique_ptrna drugi pomoću semantike pomeranja (std::move). - Prilagodljiv brisač: Može se pružiti sopstveni brisač (deleter) za upravljanje specifičnim načinima oslobađanja resursa.
Princip rada zasniva se na RAII (Resource Acquisition Is Initialization): resurs (dinamički alocirana memorija) se stiče pri kreiranju objekta (unique_ptr) i oslobađa pri uništenju objekta.
#include <memory> // Za unique_ptr
#include <iostream>
class MyClass {
public:
MyClass() { std::cout << "MyClass kreiran\n"; }
~MyClass() { std::cout << "MyClass uništen\n"; }
};
int main() {
{
// Kreiranje unique_ptr koji poseduje objekat MyClass
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();
// U ovom trenutku, ptr1 je isključivi vlasnik objekta
// auto ptr2 = ptr1; // Greška pri kompilaciji: kopiranje je zabranjeno
// Prenos vlasništva sa ptr1 na ptr2
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
// Nakon prenosa, ptr1 više ne poseduje objekat (postao je nullptr)
if (!ptr1) {
std::cout << "ptr1 ne poseduje objekat: " << (ptr1 ? "Da" : "Ne") << "\n";
}
// Obuhvat za ptr2 završava.
// ptr2 se uništava, a objekat MyClass koji poseduje automatski se briše.
} // Objekat MyClass se uništava ovde
std::cout << "Kraj main.\n";
return 0;
}
Upoređenje sa raw pointer:
| Karakteristika | raw pointer |
std::unique_ptr |
|---|---|---|
| Vlasništvo nad resursom | Nije definisano | Isključivo |
| Automatsko brisanje | Ne | Da |
| Semantika kopiranja | Da | Ne (samo pomeranje) |
| Rizik od curenja memorije | Visok | Nizak |
U celini, unique_ptr je preferirani način upravljanja dinamičkom memorijom u C++11 i novijim verzijama za slučajeve kada je potrebno strogo vlasništvo i automatsko oslobađanje resursa.