Eliminadores personalizados e funções make
Use std::make_unique, std::make_shared e eliminadores personalizados para recursos que não sejam memória
Eliminadores personalizados e funções make é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.
Por que usar funções de liberação personalizadas?
Nem todo recurso é liberado por delete. Identificadores de arquivos, soquetes, recursos específicos do OS e arranjos precisam, cada um, de uma função de limpeza diferente.
Função de liberação padrão de unique_ptr
Por padrão, unique_ptr<T> usa delete. Para arranjos, use unique_ptr<T[]>, que chama delete[].
Especificando uma função de liberação personalizada
Passe um objeto chamável como segundo argumento de modelo. A função de liberação recebe o ponteiro bruto e o libera adequadamente.
auto closer = [](FILE* f) { if (f) std::fclose(f); };
std::unique_ptr<FILE, decltype(closer)> file(
std::fopen("data.txt", "r"), closer);Função de liberação de shared_ptr
shared_ptr armazena sua função de liberação no bloco de controle — o tipo sofre apagamento de tipo, portanto o próprio tipo de shared_ptr não muda.
std::shared_ptr<FILE> file(
std::fopen("data.txt", "r"),
[](FILE* f) { if (f) std::fclose(f); }
);Casos de uso comuns de funções de liberação personalizadas
Exemplos do mundo real:
- Identificadores de bibliotecas C (FILE*, sqlite3*, identificadores de curl)
- Recursos do OS (HANDLE no Windows, fd no Unix)
- Conjuntos de memória personalizados
- Objetos externos com contagem de referências
std::make_unique (C++14)
A maneira recomendada de criar um unique_ptr. Encaminha os argumentos para o construtor e evita o new bruto.
auto p = std::make_unique<Widget>(arg1, arg2);Por que usar make_unique?
Três benefícios:
- Segurança contra exceções — nenhum
newbruto no código do usuário - Não é necessário escrever o tipo duas vezes
- Não é possível passar acidentalmente o ponteiro bruto para dois unique_ptr
std::make_shared
Para shared_ptr, make_shared aloca o bloco de controle e o objeto em uma única alocação no heap — mais rápido do que fazer alocações separadas.
auto p = std::make_shared<Widget>(arg1, arg2);Quando make_shared tem desvantagens
A alocação única faz com que a memória do objeto só seja liberada quando todos os weak_ptr também tiverem sido destruídos. Se seus weak_ptr sobreviverem aos shared_ptr, prefira a construção em duas etapas.
Combinando funções de liberação personalizadas com funções make
make_unique e make_shared não aceitam diretamente uma função de liberação personalizada. Nesse caso, construa o ponteiro inteligente manualmente.
// make_shared cannot take a deleter
std::shared_ptr<FILE> file(
std::fopen("data.txt", "r"),
[](FILE* f) { if (f) std::fclose(f); }
);Armadilha: tipo de lambda como parâmetro de modelo
Cada lambda tem um tipo exclusivo. Para unique_ptr, use decltype(my_deleter) ao declarar; ou use uma função nomeada ou um ponteiro para função para manter os tipos simples.
Verificação rápida
Qual função fábrica permite alocar um std::shared_ptr e seu bloco de controle em uma única alocação no heap?
Recapitulação
Use make_unique e make_shared nos casos rotineiros. Forneça uma função de liberação personalizada (uma lambda ou função) quando o recurso precisar de algo além de delete — identificadores de arquivos, objetos do OS ou limpeza de bibliotecas C.
Perguntas Frequentes
A aula “Eliminadores personalizados e funções make” é grátis?
Sim — o texto completo de “Eliminadores personalizados e funções make” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.
O que vou aprender em “Eliminadores personalizados e funções make”?
Use std::make_unique, std::make_shared e eliminadores personalizados para recursos que não sejam memória Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C++ Academy?
Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Eliminadores personalizados e funções make”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C++ Academy?
Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Por que os ponteiros inteligentes substituem new e delete brutos
- unique_ptr: propriedade exclusiva
- shared_ptr e weak_ptr: propriedade partilhada
- Eliminadores personalizados e funções make