贝利信息

c++的"Rule of Five" (五法则)指的是什么? (现代C++资源管理)

日期:2026-01-14 00:00 / 作者:穿越時空
Rule of Five 是 C++11 资源管理约定:当类需自定义析构函数、拷贝构造函数或拷贝赋值运算符时,通常也应显式定义移动构造函数和移动赋值运算符,共五个特殊成员函数,语义耦合紧密,漏写易致资源泄漏、双重释放或性能退化。

什么是 Rule of Five?

Rule of Five 是 C++11 引入的资源管理约定:当类需要自定义析构函数、拷贝构造函数或拷贝赋值运算符时,通常也应显式定义移动构造函数和移动赋值运算符。这五个特殊成员函数共同构成“五法则”。

哪些函数必须一起出现?

这五个函数是:~T()T(const T&)T& operator=(const T&)T(T&&)T& operator=(T&&)。它们不是语法强制要求同时存在,但语义上高度耦合——漏掉移动版本,会导致本可高效移动的对象被意外拷贝;漏掉拷贝版本,可能让本应禁止拷贝的类意外支持(比如用 std::vector 存储时触发拷贝)。

不遵守 Rule of Five 的典型错误现象

最常见的是“浅拷贝后双重释放”:自定义了析构函数释放 int*,但没写拷贝构造函数,编译器生成的默认拷贝只是复制指针值;两个对象析构时都 delete 同一块内存,触发未定义行为。

现代 C++ 中更推荐的做法

Rule of Five 不是目标,而是警示信号:它说明你正在手动管理资源。更好的做法是“Rule of Zero”——把资源封装进 RAII 类型(如 std::unique_ptrstd::vector),让编译器自动生*部五个函数,且语义正确。

移动操作的正确性远比看起来更微妙,尤其在异常安全和自赋值场景下——哪怕只漏掉一行 ptr = nullptr,就可能让整个类变成定时炸弹。