RAII e a liberação automática de recursos em C++
Nesta lição, você vai comparar o fechamento seguro de arquivos em C com a técnica RAII de C++, em que os recursos são liberados automaticamente.
Introdução
RAII (Resource Acquisition Is Initialization) é a técnica de ligar o tempo de vida de um recurso, como um arquivo, uma área de memória ou uma conexão, ao tempo de vida de um objeto. Quando o objeto é destruído, o recurso é liberado automaticamente em qualquer saída do bloco, até mesmo quando ocorre uma exceção.
Pontos importantes
- Entenda como se faz em C antes de aprender as abstrações de C++.
- Use RAII e semântica de valor (value semantics) para expressar a posse dos recursos.
- Prefira as ferramentas com segurança de tipos de C++ a macros e conversões de tipo.
Exemplos de código C e C++
#include <stdio.h>
int main(void) {
int result = 1;
FILE *file = fopen("scores.txt", "w");
if (!file) goto cleanup;
if (fputs("Ada 95\n", file) < 0) goto cleanup;
result = 0;
cleanup:
if (file) fclose(file);
puts(result ? "failed" : "saved");
return result;
}
saved
#include <fstream>
#include <iostream>
int main() {
std::ofstream file("scores.txt");
if (!file) return 1;
file << "Ada 95\n";
std::cout << "saved\n";
}
saved
Comparação entre C e C++
Em C, o programa usa o rótulo cleanup e a instrução goto para que todos os caminhos, de sucesso ou de erro, passem pelo fclose que fecha o arquivo. Em C++, std::ofstream fecha o arquivo no destrutor (destructor) quando a variável file sai de escopo. Assim, o gerenciamento de recursos fica mais limpo e o risco de esquecer de liberar algo diminui.
C usa convenções de nomes, callbacks, macros e structs com contexto.
C++ oferece abstrações com escopo claro, seguras quanto a tipos e que normalmente não custam nada a mais na execução.
Exercícios práticos
Execute as duas versões e depois mude o código para observar a diferença de segurança que cada linguagem oferece.
- Escreva primeiro o mecanismo em C e só depois use o recurso equivalente de C++.
- Troque a liberação manual de recursos por RAII.
- Verifique se o recurso causa alocações de memória ou chamadas de funções virtuais.
Pratique com um desafio
Use o conteúdo desta lição para resolver um problema real. Cada desafio roda no navegador, com testes instantâneos e uma revisão por IA.
Todos os desafios