Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Proporcionar Eliminadores Personalizados para Smart Pointers | Temas Avanzados
C++ Smart Pointers
course content

Contenido del Curso

C++ Smart Pointers

C++ Smart Pointers

1. Introducción a los Punteros Inteligentes
2. Punteros Únicos
3. Punteros Compartidos
4. Punteros Débiles
5. Temas Avanzados

book
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:

cpp

main

copy
1234567891011121314151617181920212223
#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.

cpp

main

copy
1234567891011121314151617181920
#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.

question mark

¿Por qué usarías un eliminador personalizado con un puntero inteligente?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 5. Capítulo 1
Lamentamos que algo salió mal. ¿Qué pasó?
some-alt