Conteúdo do Curso
C++ Smart Pointers
C++ Smart Pointers
Fornecendo Destruidores Personalizados para Smart Pointers
Destruidores personalizados fornecem controle preciso sobre a limpeza de recursos, garantindo a desalocação eficiente de memória para vários recursos, como manipuladores de arquivos, conexões e estruturas de dados personalizadas.
Por exemplo, ao lidar com arquivos usando smart pointers, um destruidor personalizado pode garantir que tanto a memória dinâmica seja liberada quanto o arquivo seja devidamente fechado quando o ponteiro sair do escopo. Veja como:
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 }
Ao criar o ponteiro único, passamos custom_file_deleter
como um parâmetro de template. A palavra-chave decltype
extrai seu tipo em tempo de compilação. Este destruidor personalizado garante tanto a desalocação de memória quanto o fechamento do arquivo em uma única função.
Ponteiros Compartilhados e Destruidores Personalizados
Para usar um destruidor personalizado com um ponteiro compartilhado, passe-o para o construtor do ponteiro compartilhado.
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 }
Criando um ponteiro compartilhado para um inteiro e especificando um destruidor personalizado no construtor.
Obrigado pelo seu feedback!