C++ Unique Pointer

Da Andreabont's Wiki.

std::unique_ptr è uno smart pointer di C++ che permette di gestire un puntatore ad una risorsa, e liberarla automaticamente una volta che si esce dallo scope.

Utilizzare un deallocatore specifico

A volte non è possibile deallorare in modo standard delle risorse, è quindi possibile fornire un deallocatore da usare. Per esempio possiamo usare lo smarr pointer per chiudere un file descriptor.

#include <memory>
#include <fstream>

void close_file(std::FILE* fp) {
    std::fclose(fp);
}

int main() {
    
    std::unique_ptr<std::FILE, decltype(&close_file)> fp(std::fopen("demo.txt", "r"), &close_file);

    // Codice...
    
}

Trasferire la proprietà di uno unique_ptr

Avendo due unique_ptr è possibile trasferire l'oggetto contenuto da un puntatore ad un altro tramite la funzione std::move, da notare che una volta trasferito in un altro puntatore, il primo diventa nullo.

auto uptr1 = std::make_unique<int>(5);
std::unique_ptr<int> uptr2;
uptr2 = std::move(uptr1); // Qui avviene il passaggio da uptr1 a uptr2

Questo può essere fatto anche passando lo shared_ptr come parametro di una funzione, implementando così un sink (l'oggetto locale smette di esistere e viene passato e gestito dalla funzione chiamata).

void miafunzione(std::unique_ptr<int> uptr2) {
   // Codice
} // Qui viene distrutto uptr2

int main() {  
   auto uptr1 = std::make_unique<int>(5);
   miafunzione(std::move(uptr1)); // Qui avviene il passaggio da uptr1 a uptr2
}