0

0

c++如何写出异常安全的代码 c++异常安全三原则【规范】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-03 19:09:15

|

253人浏览过

|

来源于php中文网

原创

异常安全的核心目标是确保异常发生时程序状态有效:不泄漏资源、不损坏数据、不破坏不变量;C++提供基本、强和不抛异常三类保证,需依托RAII、Copy-and-Swap及noexcept移动/析构实现。

c++如何写出异常安全的代码 c++异常安全三原则【规范】

异常安全的核心目标

异常安全不是“不抛异常”,而是确保程序在异常发生时仍保持有效状态:对象不泄漏、数据不损坏、不变量不被破坏。C++中主要关注三类保证:基本异常安全(资源不泄漏,对象处于可析构状态)、强异常安全(操作要么完全成功,要么回滚到调用前状态)、不抛异常安全(noexcept,关键路径如析构函数、移动操作必须满足)。

坚持RAII:资源管理的基石

所有资源(内存、文件、锁、socket等)必须封装在对象中,由构造函数获取、析构函数释放。避免裸指针和手动delete/new。

  • std::unique_ptr替代new/delete,转移所有权自动释放
  • std::shared_ptr管理共享资源,引用计数保障生命周期
  • 互斥锁用std::lock_guardstd::scoped_lock作用域结束即解锁
  • 文件句柄可用std::fstream,RAII自动关闭

编写强异常安全的函数:Copy-and-Swap惯用法

赋值运算符、容器插入等易出错操作,应先完成所有可能抛异常的操作(如内存分配、拷贝),再原子切换状态。

维普科创助手
维普科创助手

AI驱动的一站式科研资源服务平台

下载
  • 实现swap()为noexcept成员函数(通常只交换指针/整数)
  • 赋值运算符按“拷贝构造临时对象 → swap → 临时对象析构”流程写
  • 例如:T& operator=(T other) { swap(*this, other); return *this; }(注意参数传值,触发拷贝)

析构函数与移动操作必须noexcept

析构函数若抛异常,可能导致std::terminate;移动构造/赋值若未声明noexcept,容器(如std::vector扩容)将退化为拷贝而非移动。

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

  • 所有析构函数默认隐式noexcept,切勿在其中调用可能抛异常的函数
  • 移动操作显式加noexceptT(T&&) noexcept { ... }
  • 自定义swap也应声明为noexcept,供标准库内部调用

相关专题

更多
java基础知识汇总
java基础知识汇总

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

1437

2023.10.24

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

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

226

2024.02.23

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

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

85

2025.10.17

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

377

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

565

2023.08.10

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

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

268

2023.11.13

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

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

208

2023.12.29

漫画合集pdf网盘入口_漫画解说合集一口气看完
漫画合集pdf网盘入口_漫画解说合集一口气看完

精选高人气漫画合集PDF,一站式网盘入口直达!深度漫画解说整合,一口气看完经典与新作,剧情梳理清晰,省时省力,追漫党必看合集。

8

2026.01.04

Java云原生微服务开发_Java如何开发云原生微服务
Java云原生微服务开发_Java如何开发云原生微服务

Java云原生微服务开发是指 利用Java语言,结合云原生理念和技术(如容器、Kubernetes),将大型应用拆解为一系列独立、小巧、松耦合的微服务,并通过轻量级API进行通信,实现快速开发、部署、弹性伸缩和高效运维的现代化应用开发模式。它融合了微服务架构(将应用拆分)与云原生技术(容器化、编排、自动化),旨在构建高可用、可扩展的分布式系统。

7

2026.01.04

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 0.9万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号