Sobes.tech
Middle

Qual è il ruolo dei delimitatori negli indicatori intelligenti?

sobes.tech AI

Risposta dell'AI

I delimitatori (deleters) nei puntatori intelligenti consentono di definire una logica personalizzata per liberare la risorsa a cui punta il puntatore intelligente. Per impostazione predefinita, std::unique_ptr utilizza delete, e std::shared_ptr utilizza delete o delete[]. Un delimitatore può essere una funzione, un functor o un'espressione lambda.

Esempi:

std::unique_ptr con un delimitatore di funzione:

#include <cstdio> // Per fclose

void file_deleter(FILE* file) {
    if (file) {
        fclose(file);
    }
}

// ...
// std::unique_ptr<FILE, decltype(&file_deleter)> file_ptr(fopen("example.txt", "r"), &file_deleter);
// ...

std::unique_ptr con un delimitatore lambda:

#include <iostream>
#include <memory>

// ...
// auto resource_deleter = [](int* p){ std::cout << "Eliminando risorsa\n"; delete p; };
// std::unique_ptr<int, decltype(resource_deleter)> ptr(new int(10), resource_deleter);
// ...

std::shared_ptr con un delimitatore lambda:

#include <iostream>
#include <memory>

// ...
// std::shared_ptr<int> shared_ptr_with_deleter(new int(20), [](int* p){ std::cout << "Eliminando risorsa condivisa\n"; delete p; });
// ...

Il ruolo dei delimitatori è importante nei seguenti scenari:

  • Gestione di risorse diverse dalla memoria: File, socket di rete, gestori di database, ecc.
  • Configurazione del processo di rilascio della memoria: Ad esempio, usare delete[] per array o un pool di oggetti.
  • Logica aggiuntiva al rilascio: Registrazione, pulizia di strutture correlate.

Per std::unique_ptr, il tipo del delimitatore è parte del tipo del puntatore, il che può complicare il lavoro con il polimorfismo. Per std::shared_ptr, il tipo del delimitatore non è parte del tipo del puntatore, offrendo maggiore flessibilità.