0Pricing
C++ Academy · Aula

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 new bruto 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

  1. Por que os ponteiros inteligentes substituem new e delete brutos
  2. unique_ptr: propriedade exclusiva
  3. shared_ptr e weak_ptr: propriedade partilhada
  4. Eliminadores personalizados e funções make
← Voltar para C++ Academy