C++ moderno e alternativas em C

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++

C
Executar →
main.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;
}
Resultado da execução
saved
C++
Executar →
main.cpp
#include <fstream>
#include <iostream>

int main() {
    std::ofstream file("scores.txt");
    if (!file) return 1;
    file << "Ada 95\n";
    std::cout << "saved\n";
}
Resultado da execução
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

C usa convenções de nomes, callbacks, macros e structs com contexto.

C++

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