Destrutores e limpeza
Libere recursos automaticamente
Destrutores e limpeza é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 2 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.
O que um destrutor faz
Um destrutor é executado quando termina o tempo de vida de um objeto. Sua função é liberar tudo o que o objeto possui. Ele recebe o nome ~ClassName.
#include <iostream>
class File {
public:
~File() { std::cout << "closing file\n"; }
};
int main() {
File f;
} // ~File runs hereLiberando a memória pertencente ao objeto
Se uma classe possui memória dinâmica, seu destrutor deve liberá-la. Este é o local clássico para chamar delete.
#include <iostream>
class Buffer {
int* data;
public:
Buffer(int n) : data(new int[n]) {}
~Buffer() { delete[] data; } // cleanup
};
int main() { Buffer b(10); }Os destrutores são executados automaticamente
Você não chama os destrutores por conta própria para objetos da pilha — o compilador insere a chamada no fim do escopo.
Ordem inversa dos membros
Os objetos membros são destruídos na ordem inversa em que foram declarados, depois da execução do corpo do destrutor.
#include <iostream>
struct A { ~A() { std::cout << "~A\n"; } };
struct B { ~B() { std::cout << "~B\n"; } };
struct C {
A a;
B b; // destroyed before a
~C() { std::cout << "~C\n"; }
};
int main() { C c; }Destrutores virtuais
Se você excluir um objeto derivado por meio de um ponteiro para a classe base, o destrutor da classe base deve ser virtual — caso contrário, a parte derivada vazará.
#include <iostream>
struct Base {
virtual ~Base() { std::cout << "~Base\n"; }
};
struct Derived : Base {
~Derived() override { std::cout << "~Derived\n"; }
};
int main() {
Base* p = new Derived();
delete p; // both run thanks to virtual
}Os destrutores não devem lançar exceções
Lançar uma exceção de um destrutor durante o desenrolamento da pilha encerra o programa. Os destrutores devem ser marcados (implicitamente) como noexcept e nunca permitir que exceções escapem.
O destrutor padrão
Se você não escrever nenhum, o compilador gera um destrutor que destrói cada membro. Para classes que têm apenas membros RAII, isso é exatamente o correto.
#include <string>
#include <vector>
struct Record {
std::string name; // self-cleaning
std::vector<int> values; // self-cleaning
}; // default destructor is enoughDestrutor = default
Escreva ~Class() = default; para solicitar explicitamente o destrutor gerado pelo compilador — útil quando você precisa de um destrutor virtual, mas não de lógica personalizada.
#include <iostream>
struct Shape {
virtual ~Shape() = default; // virtual + default
};Liberando recursos que não são memória
Os destrutores também fecham arquivos, liberam bloqueios e desconectam soquetes — não apenas liberam memória. Qualquer recurso adquirido deve ser tratado aqui.
Ordem entre objetos
Várias variáveis locais são destruídas na ordem inversa da construção, portanto um destrutor pode usar com segurança objetos criados antes dele.
Deixe os membros RAII fazerem o trabalho
Se cada membro for de um tipo RAII, geralmente você não precisará de nenhum destrutor personalizado. Reserve os destrutores escritos manualmente para recursos brutos.
Verificação rápida
Teste sua compreensão dos destrutores.
Recapitulação
Você aprendeu que os destrutores liberam automaticamente os recursos pertencentes ao objeto no fim do tempo de vida, executam os membros na ordem inversa de declaração, não devem lançar exceções e precisam ser virtual em classes base polimórficas. Membros RAII frequentemente tornam desnecessários os destrutores personalizados.
Aprenda C++ com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 51
- Aulas
- 203
Perguntas Frequentes
A aula “Destrutores e limpeza” é grátis?
Sim — o texto completo de “Destrutores e limpeza” é 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 “Destrutores e limpeza”?
Libere recursos automaticamente 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 2 de 4.
Quanto tempo leva a aula “Destrutores e limpeza”?
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
- O princípio RAII
- Destrutores e limpeza
- Regra dos três/cinco
- Guardas de escopo