讲师中心 微信公众号
AI工具推荐 视频效率加速

C++中的“三/五/零之法则”是什么?(资源管理)

冬静酱_1076

冬静酱_1076

发布时间:2026-01-04 10:45:44

|

901人浏览过

|

来源于php中文网

原创

三/五/零之法则是C++资源管理核心原则:三法则要求自定义析构、拷贝构造、拷贝赋值三者之一时需显式定义其余两个;五法则在C++11中增加移动构造和移动赋值;零法则倡导用RAII智能指针等替代裸资源,使所有特殊成员函数均可默认。

c++中的“三/五/零之法则”是什么?(资源管理)

“三/五/零之法则”是C++中关于资源管理的一组指导原则,核心在于:**当类需要显式管理资源(如动态内存、文件句柄、互斥锁等)时,必须谨慎定义或删除特定的特殊成员函数,否则容易引发资源泄漏、重复释放或浅拷贝问题。**

三法则(C++98/03)

如果类中定义了以下任意一个函数,通常也应显式定义另外两个:

  • 析构函数(destructor):用于释放资源(如 delete ptr;)
  • 拷贝构造函数(copy constructor):避免默认的浅拷贝导致多个对象指向同一资源
  • 拷贝赋值运算符(copy assignment operator):同样需深拷贝或转移资源所有权

例如,一个持有裸指针的类若只写了析构函数,而依赖编译器生成的拷贝函数,就可能在对象拷贝后出现双重 delete。

五法则(C++11起)

C++11引入移动语义后,三法则扩展为五法则。若类需要自定义资源管理,通常还需定义:

立即学习“C++免费学习笔记(深入)”;

  • 移动构造函数(move constructor):将资源从临时对象“接管”过来,原对象置为有效但空状态(如将指针置为 nullptr)
  • 移动赋值运算符(move assignment operator):类似移动构造,但需先清理当前资源,再接管新资源

不定义移动函数,编译器不会自动生成(即使你已定义了拷贝函数),此时移动操作会退化为拷贝——影响性能,甚至在某些容器(如 std::vector 扩容)中导致编译失败。

C++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载

零法则(Rule of Zero)

现代C++更推荐的做法:**不手动管理资源,而是用RAII封装类(如 std::unique_ptr、std::vector、std::string)替代裸指针和手动 new/delete。**

这样,所有特殊成员函数都可使用编译器默认版本(= default),无需用户定义——即“零个自定义特殊函数”。

  • 类只包含RAII成员?→ 默认构造、析构、拷贝、移动全部安全可用
  • 有需要自定义行为?→ 优先通过组合而非继承实现,保持资源管理职责单一

零法则是对三/五法则的升华:不是“如何正确写五个函数”,而是“如何避免写它们”。

补充:显式删除与默认化的选择

若确定某类不应被拷贝或移动,应显式 = delete,而非不写:

  • MyClass(const MyClass&) = delete; —— 禁止拷贝,比隐式禁止更清晰、更早报错
  • MyClass(MyClass&&) = default; —— 若未定义析构/拷贝函数,且成员支持移动,可放心默认

是否生成移动函数,取决于是否显式声明了拷贝/析构/移动中的任一个——规则较细,但记住:只要涉及资源管理,就该主动决策,而不是依赖默认行为。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5239

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5764

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2384

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1592

2025.10.17

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

1938

2023.09.20

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

299

2026.04.23

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

2451

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

765

2023.12.29

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

60

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn