C++ 代码审查:检查什么以及如何提供反馈

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么需要 C++ 的 Code Review

Code review(代码审查)是专业开发中的关键实践之一。在 C++ 世界中,内存管理错误或 STL 的不当使用可能导致难以察觉的 bug 和内存泄漏,高质量的审查变得至关重要。这不仅仅是检查代码风格,而是系统地寻找潜在问题:从逻辑错误到违反 RAII(资源获取即初始化)原则。

在本文中,我们将分析在审查 C++ 代码时需要注意什么,如何提出既有帮助又不冒犯的评论,以及如何在团队中培养健康的审查文化。

审查 C++ 代码时要检查什么

审查不是像读书一样阅读代码。它是主动分析。使用以下检查清单,以免遗漏重要内容。

1. 内存安全与 RAII

C++ 不会原谅对资源的疏忽。请检查:

  • 是否使用了智能指针(std::unique_ptr、std::shared_ptr)而不是裸的 new/delete。
  • 如果代码在复杂场景中使用原始指针,是否存在内存泄漏。
  • 是否遵循 RAII 原则:所有资源(文件、套接字、互斥锁)都应封装在具有正确构造函数和析构函数的类中。
// 不好:原始指针,手动管理
void process() {
    int* data = new int[100];
    // ... 忘记 delete[] — 内存泄漏
}

// 好:智能指针
void process() {
    auto data = std::make_unique<int[]>(100);
    // 内存会自动释放
}

2. STL 和算法的正确使用

C++ 标准库功能强大,但很容易被误用。

  • 检查是否在可以使用 std::find、std::copy、std::transform 的地方编写了手动循环。
  • 注意迭代器失效(例如,在 std::vector 的 push_back 之后)。
  • 当对象不被修改时,是否对引用使用了 const(const std::string& 而不是 std::string)。
// 不好:复制字符串并手动搜索
bool hasValue(std::string s, char c) {
    for (size_t i = 0; i < s.size(); ++i) {
        if (s[i] == c) return true;
    }
    return false;
}

// 好:const 引用和算法
bool hasValue(const std::string& s, char c) {
    return std::find(s.begin(), s.end(), c) != s.end();
}

3. 现代 C++ 规则(C++11/14/17/20)

过时的构造是一个危险信号。

  • 将 typedef 替换为 using。
  • 对复杂类型使用 auto(但不要滥用——可读性更重要)。
  • 使用 nullptr 而不是 NULL 或 0。
  • 在适当的地方检查 constexpr 和 noexcept。

4. 性能和架构

即使是正确的代码也可能很慢或难以维护。

  • 避免不必要的复制:按值传递大对象是常见错误。
  • 检查是否在热循环中调用了虚函数(除非有正当理由)。
  • 评估类的耦合度:代码是否违反了 SOLID 原则。

如何提供反馈:建设性审查的规则

技术部分只是成功的一半。另一半是人为因素。表达不当的评论可能会打击作者的积极性或引发冲突。

1. 区分对代码的批评和对个人的批评

谈论代码,而不是程序员。不要说“你写了糟糕的代码”,而要说“这个地方最好使用智能指针以避免内存泄漏”。

2. 使用“为什么”

博客

书籍推荐