Kursinhalt
C++ Smart Pointers
C++ Smart Pointers
Bereitstellung Benutzerdefinierter Löschfunktionen für Smart-Pointer
Benutzerdefinierte Deleter bieten präzise Kontrolle über die Bereinigung von Ressourcen und gewährleisten eine effiziente Speicherfreigabe für verschiedene Ressourcen wie Dateihandles, Verbindungen und benutzerdefinierte Datenstrukturen.
Zum Beispiel kann ein benutzerdefinierter Deleter beim Umgang mit Dateien mit Smart-Pointern sicherstellen, dass sowohl der dynamische Speicher freigegeben als auch die Datei ordnungsgemäß geschlossen wird, wenn der Zeiger den Gültigkeitsbereich verlässt. So geht's:
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 }
Beim Erstellen des einzigartigen Zeigers übergeben wir custom_file_deleter
als Template-Parameter. Das Schlüsselwort decltype
extrahiert seinen Typ zur Kompilierzeit. Dieser benutzerdefinierte Deleter sorgt sowohl für die Speicherfreigabe als auch für das Schließen der Datei in einer einzigen Funktion.
Geteilte Zeiger und benutzerdefinierte Deleter
Um einen benutzerdefinierten Deleter mit einem geteilten Zeiger zu verwenden, übergeben Sie ihn an den Konstruktor des geteilten Zeigers.
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 }
Erstellen eines Shared Pointers auf eine Ganzzahl und Festlegen eines benutzerdefinierten Löschers im Konstruktor.
Danke für Ihr Feedback!