Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Fornecendo Destruidores Personalizados para Smart Pointers | Tópicos Avançados
C++ Smart Pointers
course content

Conteúdo do Curso

C++ Smart Pointers

C++ Smart Pointers

1. Introdução a Ponteiros Inteligentes
2. Ponteiros Únicos
3. Ponteiros Compartilhados
4. Ponteiros Fracos
5. Tópicos Avançados

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

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 }

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.

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 }

Criando um ponteiro compartilhado para um inteiro e especificando um destruidor personalizado no construtor.

question mark

Por que você usaria um destruidor personalizado com um ponteiro inteligente?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 5. Capítulo 1
Sentimos muito que algo saiu errado. O que aconteceu?
some-alt