Middle
Ako funguje unique_ptr v C++?
sobes.tech AI
Odpoveď od AI
std::unique_ptr — je inteligentný ukazovateľ, ktorý implementuje výlučné vlastníctvo nad dynamicky alokovaným objektom. Zabezpečuje automatické riadenie pamäte: objekt, na ktorý ukazuje unique_ptr, sa automaticky odstráni pri zničení unique_ptr.
Kľúčové vlastnosti:
- Výlučné vlastníctvo: V akomkoľvek momente môže vlastniť konkrétny objekt iba jeden
unique_ptr. - Nepodporuje kopírovanie:
unique_ptrnemôže byť kopírovaný. To zabraňuje viacerému vlastníctvu toho istého objektu a problému "dvojitého odstránenia". - Semantika presunu: Vlastníctvo objektu môže byť prevedené z jedného
unique_ptrna iný pomocou semantics presunu (std::move). - Nastaviteľný mazač: Môže byť poskytnutý vlastný mazač (deleter) na správu špecifických spôsobov uvoľnenia zdrojov.
Princíp fungovania je založený na RAII (Resource Acquisition Is Initialization): zdroj (dynamicky alokovaná pamäť) sa nadobúda pri vytvorení objektu (unique_ptr) a uvoľňuje sa pri zničení tohto objektu.
#include <memory> // Pre unique_ptr
#include <iostream>
class MyClass {
public:
MyClass() { std::cout << "MyClass vytvorený\n"; }
~MyClass() { std::cout << "MyClass zničený\n"; }
};
int main() {
{
// Vytvorenie unique_ptr, ktorý vlastní objekt MyClass
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();
// V tomto momente je ptr1 výlučným vlastníkom objektu
// auto ptr2 = ptr1; // Chyba kompilácie: kopírovanie je zakázané
// Presun vlastníctva z ptr1 na ptr2
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
// Po presune už ptr1 ne vlastní objekt (stal sa nullptr)
if (!ptr1) {
std::cout << "ptr1 ne vlastní objekt: " << (ptr1 ? "Áno" : "Nie") << "\n";
}
// Oblasť platnosti pre ptr2 končí.
// ptr2 sa zničí a objekt MyClass, ktorý vlastní, sa automaticky odstráni.
} // Objekt MyClass sa zničí tu
std::cout << "Koniec main.\n";
return 0;
}
Porovnanie s raw pointer:
| Charakteristika | raw pointer |
std::unique_ptr |
|---|---|---|
| Vlastníctvo zdroja | Nie je definované | Výlučné |
| Automatické odstránenie | Nie | Áno |
| Semantika kopírovania | Áno | Nie (len presun) |
| Úniky pamäte | Vysoké riziko | Nízke riziko |
Celkovo je unique_ptr preferovaným spôsobom riadenia dynamickej pamäte v C++11 a vyšších verziách pre prípady, keď je požadované prísne vlastníctvo a automatické uvoľnenie zdrojov.