Sobes.tech
Middle

Quel est le rôle des délimiteurs dans les indicateurs intelligents?

sobes.tech IA

Réponse de l'IA

Les déléteurs (deleters) dans les pointeurs intelligents permettent de définir une logique personnalisée pour libérer la ressource pointée par le pointeur intelligent. Par défaut, std::unique_ptr utilise delete, et std::shared_ptr utilise delete ou delete[]. Un déléteur peut être une fonction, un foncteur ou une expression lambda.

Exemples :

std::unique_ptr avec un déléteur de fonction :

#include <cstdio> // Pour 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 avec un déléteur lambda :

#include <iostream>
#include <memory>

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

std::shared_ptr avec un déléteur lambda :

#include <iostream>
#include <memory>

// ...
// std::shared_ptr<int> shared_ptr_with_deleter(new int(20), [](int* p){ std::cout << "Suppression de la ressource partagée\n"; delete p; });
// ...

Le rôle des déléteurs est important dans les scénarios suivants :

  • Gestion de ressources autres que la mémoire : Fichiers, sockets réseau, gestionnaires de bases de données, etc.
  • Configuration du processus de libération de mémoire : Par exemple, utiliser delete[] pour des tableaux ou un pool d'objets.
  • Logique supplémentaire lors de la libération : Journalisation, nettoyage de structures associées.

Pour std::unique_ptr, le type du déléteur fait partie du type du pointeur, ce qui peut compliquer le travail avec le polymorphisme. Pour std::shared_ptr, le type du déléteur ne fait pas partie du type du pointeur, ce qui offre une meilleure flexibilité.