引言:为什么需要 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. 区分对代码的批评和对个人的批评
谈论代码,而不是程序员。不要说“你写了糟糕的代码”,而要说“这个地方最好使用智能指针以避免内存泄漏”。