¿Cuál es el papel de los delimitadores en los indicadores inteligentes?
sobes.tech AI
Respuesta de la IA
Los delimitadores (deleters) en punteros inteligentes permiten definir la lógica personalizada para liberar el recurso al que apunta el puntero inteligente. Por defecto, std::unique_ptr usa delete, y std::shared_ptr usa delete o delete[]. Un delimitador puede ser una función, un functor o una expresión lambda.
Ejemplos:
std::unique_ptr con un delimitador de función:
#include <cstdio> // Para 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 con un delimitador lambda:
#include <iostream>
#include <memory>
// ...
// auto resource_deleter = [](int* p){ std::cout << "Eliminando recurso\n"; delete p; };
// std::unique_ptr<int, decltype(resource_deleter)> ptr(new int(10), resource_deleter);
// ...
std::shared_ptr con un delimitador lambda:
#include <iostream>
#include <memory>
// ...
// std::shared_ptr<int> shared_ptr_with_deleter(new int(20), [](int* p){ std::cout << "Eliminando recurso compartido\n"; delete p; });
// ...
El papel de los delimitadores es importante en los siguientes escenarios:
- Gestión de recursos distintos a la memoria: Archivos, sockets de red, manejadores de bases de datos, etc.
- Configuración del proceso de liberación de memoria: Por ejemplo, usar
delete[]para arrays o un grupo de objetos. - Lógica adicional al liberar: Registro, limpieza de estructuras relacionadas.
Para std::unique_ptr, el tipo del delimitador es parte del tipo del puntero, lo que puede complicar el trabajo con polimorfismo. Para std::shared_ptr, el tipo del delimitador no forma parte del tipo del puntero, lo que proporciona mayor flexibilidad.