贝利信息

c++的三五法则是什么 资源管理类的编写规则【Effective c++】

日期:2026-01-07 00:00 / 作者:裘德小鎮的故事
三五法则指析构函数、拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符这五个特殊成员函数;定义其一通常需显式定义全部五个(或=default/=delete),因默认逐成员复制/移动会导致资源泄漏、重复释放或浅拷贝问题。

三五法则(Rule of Three/Five)是 C++ 中关于资源管理类编写的核心原则,它指出:如果一个类需要显式定义以下任一特殊成员函数,那么它往往也需要显式定义其他几个——否则容易引发资源泄漏、重复释放或浅拷贝问题。

三五法则具体指哪几个函数?

“三”指 C++98/03 中的三个特殊成员函数:

“五”是 C++11 引入移动语义后扩展的两个:

即:**定义其一,通常需定义全部五个**(或至少显式 = default / = delete 来表明意图)。

为什么必须一起定义?

因为默认生成的拷贝/移动操作都是逐成员 bitwise copy/move —— 对内置类型和普通对象安全,但对裸指针、文件句柄、动态内存等资源来说,会导致:

例如:class BadString { char* p; }; 若只写析构函数释放 p,却不写拷贝构造和拷贝赋值,用 std::vector 就会崩溃。

如何正确应用三五法则?

推荐按优先级采取以下策略:

Effective C++ 中的对应条款

这一思想贯穿《Effective C++》多个条款,尤其是:

本质上,三五法则是对“资源所有权”清晰建模的技术体现 —— 每个对象应明确自己是否拥有资源、能否共享、能否移交。