Middle
Jak funguje unique_ptr v C++?
sobes.tech AI
Odpověď od AI
std::unique_ptr — je chytrý ukazatel, který implementuje výlučné vlastnictví dynamicky alokovaného objektu. Zajišťuje automatické řízení paměti: objekt, na který ukazuje unique_ptr, je automaticky odstraněn při zničení unique_ptr.
Klíčové vlastnosti:
- Výlučné vlastnictví: V jakémkoli okamžiku může vlastnit konkrétní objekt pouze jeden
unique_ptr. - Nepodporuje kopírování:
unique_ptrnelze kopírovat. To zabraňuje vícenásobnému vlastnictví téhož objektu a problému "dvojitého odstranění". - Semantika přesunu: Vlastnictví objektu může být předáno z jednoho
unique_ptrna jiný pomocí semantics přesunu (std::move). - Nastavitelný mazáček: Může být poskytnut vlastní mazáček (deleter) pro správu specifických způsobů uvolnění zdrojů.
Princip fungování je založen na RAII (Resource Acquisition Is Initialization): zdroj (dynamicky alokovaná paměť) je získán při vytvoření objektu (unique_ptr) a uvolněn při zničení tohoto objektu.
#include <memory> // Pro unique_ptr
#include <iostream>
class MyClass {
public:
MyClass() { std::cout << "MyClass created\n"; }
~MyClass() { std::cout << "MyClass destroyed\n"; }
};
int main() {
{
// Vytvoření unique_ptr, který vlastní objekt MyClass
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();
// V tuto chvíli je ptr1 výlučným vlastníkem objektu
// auto ptr2 = ptr1; // Chyba kompilace: kopírování je zakázáno
// Předání vlastnictví z ptr1 na ptr2
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
// Po přesunu již ptr1 nevlastní objekt (stal se nullptr)
if (!ptr1) {
std::cout << "ptr1 vlastní objekt: " << (ptr1 ? "Ano" : "Ne") << "\n";
}
// Oblast platnosti pro ptr2 končí.
// ptr2 je zničeno a objekt MyClass, který vlastní, je automaticky odstraněn.
} // Objekt MyClass je zničen zde
std::cout << "Konec main.\n";
return 0;
}
Porovnání s raw pointer:
| Charakteristika | raw pointer |
std::unique_ptr |
|---|---|---|
| Vlastnictví zdroje | Není určeno | Výlučné |
| Automatické odstranění | Ne | Ano |
| Semantika kopírování | Ano | Ne (pouze přesun) |
| Úniky paměti | Vysoké riziko | Nízké riziko |
Celkově je unique_ptr preferovaným způsobem řízení dynamické paměti v C++11 a vyšších verzích pro případy, kdy je vyžadováno přísné vlastnictví a automatické uvolnění zdrojů.