Contenu du cours
Pointeurs Intelligents C++
Pointeurs Intelligents C++
Fournir des Destructeurs Personnalisés pour les Pointeurs Intelligents
Les destructeurs personnalisés offrent un contrôle précis sur le nettoyage des ressources, garantissant une désallocation efficace de la mémoire pour diverses ressources telles que les descripteurs de fichiers, les connexions et les structures de données personnalisées.
Par exemple, lors de la gestion de fichiers avec des pointeurs intelligents, un destructeur personnalisé peut garantir que la mémoire dynamique est libérée et que le fichier est correctement fermé lorsque le pointeur sort de la portée. Voici comment :
main
#include <iostream> #include <memory> #include <fstream> void custom_file_deleter(std::ofstream* file) { // Check if file object is accessible and file is open if (file && file->is_open()) file->close(); delete file; // Release memory } int main() { // Creating a smart pointer to a file with a custom deleter std::unique_ptr<std::ofstream, decltype(&custom_file_deleter)> p_file(new std::ofstream("example.txt"), &custom_file_deleter); if (filePtr->is_open()) *filePtr << "Writing to the file using a smart pointer with a custom deleter!\n"; else std::cout << "Failed to open the file!\n"; // Smart pointer automatically closes the file when it goes out of scope }
Lors de la création du pointeur unique, nous passons custom_file_deleter
en tant que paramètre de modèle. Le mot-clé decltype
extrait son type lors de la compilation. Ce destructeur personnalisé assure à la fois la désallocation de la mémoire et la fermeture du fichier en une seule fonction.
Pointeurs Partagés et Destructeurs Personnalisés
Pour utiliser un destructeur personnalisé avec un pointeur partagé, passez-le au constructeur du pointeur partagé.
main
#include <iostream> #include <memory> // Custom deleter function for a resource void custom_resource_deleter(int* pointer) { std::cout << "Custom deleter called for resource at address: " << pointer << std::endl; delete ptr; } int main() { // Creating a shared pointer with a custom deleter std::shared_ptr<int> p_shared_custom_deleter(new int(42), custom_resource_deleter); // Accessing the shared resource std::cout << "Shared pointer value: " << *p_shared_custom_deleter << std::endl; // The shared pointer automatically manages the resource using the custom deleter }
Créer un pointeur partagé vers un entier et spécifier un destructeur personnalisé dans le constructeur.
Merci pour vos commentaires !