Middle
Kā darbojas unique_ptr C++?
sobes.tech AI
Atbilde no AI
std::unique_ptr — tas ir gudrs rādītājs, kas īsteno izņēmuma īpašumu dinamiski piešķirtam objektam. Tas nodrošina automātisku atmiņas pārvaldību: objekts, uz kuru norāda unique_ptr, automātiski tiek dzēsts unique_ptr iznīcināšanas laikā.
Galvenās īpašības:
- Izņēmuma īpašums: Katru brīdi tikai viens
unique_ptrvar piederēt konkrētam objektam. - Kopēšana nav atļauta:
unique_ptrnevar tikt kopēts. Tas novērš vairākkārtēju īpašuma piederību tam pašam objektam un "dubultās dzēšanas" problēmu. - Pārvietošanas semantika: Objekta īpašums var tikt nodots no viena
unique_ptruz citu, izmantojot pārvietošanas semantiku (std::move). - Konfigurējams dzēšējs: Var nodrošināt savu dzēšēju (deleter), lai pārvaldītu specifiskus resursu atbrīvošanas veidus.
Darbības princips balstās uz RAII (Resource Acquisition Is Initialization): resursu (dinamiski piešķirtu atmiņu) iegūst, izveidojot objektu (unique_ptr), un tas tiek atbrīvots, iznīcinot šo objektu.
#include <memory> // `unique_ptr`
#include <iostream>
class MyClass {
public:
MyClass() { std::cout << "MyClass izveidots\n"; }
~MyClass() { std::cout << "MyClass iznīcināts\n"; }
};
int main() {
{
// Izveidot `unique_ptr`, kas pieder MyClass objektam
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();
// Šajā brīdī ptr1 ir izņēmuma īpašnieks objekta
// auto ptr2 = ptr1; // Kļūda: kopēšana ir aizliegta
// Pārvietot īpašumu no ptr1 uz ptr2
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
// Pēc pārvietošanas, ptr1 vairs nepieder objektam (kļuva nullptr)
if (!ptr1) {
std::cout << "ptr1 nepieder objektam: " << (ptr1 ? "Jā" : "Nē") << "\n";
}
// ptr2 beigas
// ptr2 tiek iznīcināts, un objekts MyClass, kuru tas pieder, automātiski tiek dzēsts.
} // MyClass objekts tiek iznīcināts šeit
std::cout << "main beigas.\n";
return 0;
}
Salīdzinājums ar raw pointer:
| Raksturlielums | raw pointer |
std::unique_ptr |
|---|---|---|
| Rīks īpašumam | Nav noteikts | Izņēmuma īpašums |
| Automātiska dzēšana | Nē | Jā |
| Kopēšanas semantika | Jā | Nē (tikai pārvietošana) |
| Atmiņas noplūdes | Augsts risks | Zems risks |
Kopumā, unique_ptr ir vēlams veids, kā pārvaldīt dinamisko atmiņu C++11 un jaunākās versijās, kad nepieciešama stingra īpašība un automātiska resursu atbrīvošana.