C++ Academy · Aula

Destrutores e limpeza

Libere recursos automaticamente

Aula 2 de 413 etapas

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 here

Liberando 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 enough

Destrutor = 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.

Grátis para começar

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

  1. O princípio RAII
  2. Destrutores e limpeza
  3. Regra dos três/cinco
  4. Guardas de escopo
← Voltar para C++ Academy