Contenido del Curso
C++ Smart Pointers
C++ Smart Pointers
Proporcionar Eliminadores Personalizados para Smart Pointers
Los eliminadores personalizados proporcionan un control preciso sobre la limpieza de recursos, asegurando una desasignación eficiente de memoria para varios recursos como manejadores de archivos, conexiones y estructuras de datos personalizadas.
Por ejemplo, al manejar archivos con punteros inteligentes, un eliminador personalizado puede asegurar que tanto la memoria dinámica se libere como que el archivo se cierre correctamente cuando el puntero sale del ámbito. Aquí está cómo:
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 }
Al crear el puntero único, pasamos custom_file_deleter
como un parámetro de plantilla. La palabra clave decltype
extrae su tipo en tiempo de compilación. Este eliminador personalizado asegura tanto la desasignación de memoria como el cierre de archivos en una sola función.
Punteros Compartidos y Eliminadores Personalizados
Para usar un eliminador personalizado con un puntero compartido, pásalo al constructor del puntero compartido.
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 }
Creando un puntero compartido a un entero y especificando un eliminador personalizado en el constructor.
¡Gracias por tus comentarios!