Code review em C++: o que verificar e como dar feedback na prática

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Code review em C++: o que verificar e como dar feedback na prática

\n\n

Code review não é apenas uma formalidade, mas uma ferramenta poderosa para melhorar a qualidade do código. Em C++, a revisão é especialmente importante devido à complexidade da linguagem: gerenciamento manual de memória, templates, herança múltipla. Neste artigo, vamos analisar o que observar ao revisar código C++ e como formular observações para que sejam úteis, e não ofensivas.

\n\n

1. Segurança de memória e RAII

\n\n

A primeira coisa a verificar é o gerenciamento de recursos. Em C++ não há coletor de lixo, portanto vazamentos de memória e dupla liberação são problemas comuns. O padrão chave é RAII (Resource Acquisition Is Initialization).

\n\n

O que verificar:

\n
    \n
  • Ponteiros inteligentes (std::unique_ptr, std::shared_ptr) estão sendo usados em vez de new/delete puros?
  • \n
  • Há chamadas manuais de delete no código? (Exceto em casos raros de trabalho de baixo nível)
  • \n
  • As classes RAII estão implementadas corretamente: o recurso é adquirido no construtor e liberado no destrutor?
  • \n
  • O destrutor virtual foi esquecido na classe base?
  • \n
\n\n
// ❌ Ruim: gerenciamento manual\nvoid process() {\n    int* data = new int[100];\n    // ... se houver uma exceção, a memória vazará\n    delete[] data;\n}\n\n// ✅ Bom: RAII via std::vector\nvoid process() {\n    std::vector<int> data(100);\n    // seguro contra exceções\n}
\n\n

Como dar feedback: Em vez de "Você esqueceu de liberar a memória", diga: "Aqui é melhor usar std::vector ou std::unique_ptr — isso liberará os recursos automaticamente e tornará o código à prova de exceções".

\n\n

2. Const-correctness e referências

\n\n

C++ permite indicar explicitamente que os dados não devem ser alterados. Isso melhora a legibilidade e permite que o compilador otimize melhor o código.

\n\n

O que verificar:

\n
    \n
  • Todos os parâmetros que não são modificados estão marcados como const?
  • \n
  • Objetos grandes estão sendo passados por referência constante (const T&), e não por valor?
  • \n
  • Métodos que não modificam o objeto estão marcados como const?
  • \n
  • const_cast não está sendo usado sem extrema necessidade?
  • \n
\n\n
// ❌ Ruim: cópia de objeto grande\nstd::string toUpper(std::string s); // cópia\n\n// ✅ Bom: referência constante\nstd::string toUpper(const std::string& s); // sem cópia\n\n// ❌ Ruim: método não é const, embora não altere o estado\nclass Point {\n    int x, y;\npublic:\n    int getX() { return x; } // deveria ser const\n};\n\n// ✅ Bom\nint getX() const { return x; }
\n\n

Como dar feedback: "Vamos adicionar const para os parâmetros que não são modificados — isso tornará a interface mais clara e evitará alterações acidentais".

\n\n

3. Uso de STL e algoritmos

\n\n

A biblioteca padrão do C++ contém muitas soluções prontas. Reinventar a roda é um erro comum de iniciantes.

\n\n

O que verificar:

\n
    \n
  • Existem loops manuais que poderiam ser substituídos por algoritmos (std::find, std::sort, std::transform)?
  • \n
  • O contêiner foi escolhido corretamente? (std::vector para acesso aleatório, std::list para inserções frequentes no meio)
  • \n
  • std::string_view está sendo usado para passar strings sem cópia?
  • \n
  • reserve() para std::vector foi esquecido quando o tamanho é conhecido?
  • \n
\n\n
// ❌ Ruim: busca manual\nbool contains(const std::vector<int>& v, int val) {\n    for (size_t i = 0; i < v.size(); ++i) {\n        if (v[i] == val) return true;\n    }\n    return false;\n}\n\n// ✅ Bom: uso de STL\nbool contains(c                

Blogs

Book Recommendations