Sobes.tech
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_ptr var piederēt konkrētam objektam.
  • Kopēšana nav atļauta: unique_ptr nevar 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_ptr uz 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
Kopēšanas semantika 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.