当前位置: 首页 > news >正文

C++安全异常设计

🛡️ 异常安全的核心:资源管理

异常发生时,必须确保已申请的资源(内存、文件句柄等)被释放。RAII(Resource Acquisition Is Initialization)是解决此问题的黄金法则。

// 传统方式:易发生资源泄漏 ❌  
void unsafeFunc() {FILE* file = fopen("data.txt", "r");throw std::runtime_error("出错!"); // ⚠️ 文件句柄泄漏!fclose(file); // 永远执行不到
}// RAII解法:智能指针自动管理 ✅  
#include <memory>
void safeFunc() {auto file = std::unique_ptr<FILE, decltype(&fclose)>(fopen("data.txt", "r"), &fclose);throw std::runtime_error("出错!"); // 文件仍会被fclose自动关闭!
}

💡 异常安全三重保障
等级要求实现方法
基本保证资源不泄漏,对象状态有效析构函数释放资源 (RAII)
强保证操作成功或完全回滚(原子操作)Copy-Swap 模式 + RAII
无异常保证函数绝不抛出异常noexcept声明 + 简单逻辑

🧩 实现强保证的Copy-Swap技巧
class DataHolder {
public:void update(const std::vector<int>& newData) {auto temp = std::make_unique<std::vector<int>>(*data_); // 1. 拷贝数据temp->insert(temp->end(), newData.begin(), newData.end()); // 修改副本// 2. 无异常操作:交换指针(确保原子性)std::swap(data_, temp);  // ✅ 强保证关键!}
private:std::unique_ptr<std::vector<int>> data_;
};

🚦 关键实践原则
  1. 析构函数必须为noexcept
~MyClass() noexcept { /* 清理资源 */ } // 标准库默认如此
  1. 明确标记不抛异常的函数
void pureCalculation() noexcept { /* 无内存分配/IO操作 */ }  
  1. 切勿在构造函数中抛出异常却未清理资源
    • 已在构造中分配的资源需在异常前释放

推荐:C++学习一站式分享

http://www.xdnf.cn/news/1265635.html

相关文章:

  • 华为交换机进阶功能和场景化配置
  • Javaweb - 14.1 - 前端工程化
  • day16 - CSS3新增属性
  • 利用whisper api实现若无字幕则自动下载音频并用 whisper 转写,再用 LLM 总结。
  • Blender 快捷键速查表 (Cheat Sheet)
  • 数据结构(9)——排序
  • 202506 电子学会青少年等级考试机器人二级理论综合真题
  • 本文章分享一个本地录音和实时传输录音给app的功能(杰理)
  • java10学习笔记
  • IntelliJ IDEA 新手全方位使用指南
  • 服务机器人选择屏幕的逻辑
  • 7、docker |其余命令
  • spring.config.import 不存在
  • Pytest中实现自动生成测试用例脚本代码
  • kettle插件-kettle MinIO插件,轻松解决文件上传到MinIO服务器
  • C++隐式转换的魔法与陷阱:explicit关键字的救赎
  • qt文件操作与qss基础
  • 推荐系统学习笔记(十一)预估分数融合
  • java web项目入门了解
  • Go语言接口实战指南
  • 聊聊经常用的微服务
  • Baumer高防护相机如何通过YoloV8深度学习模型实现火星陨石坑的检测识别(C#代码UI界面版)
  • 集成电路学习:什么是RQT图形用户界面工具
  • 智慧园区误报率↓76%:陌讯多模态融合算法实战解析
  • 智能情趣设备、爆 bug:可被远程操控。。。
  • 计算机网络:如何将/22的CIDR地址块划分为4个子网
  • 前端视角下关于 WebSocket 的简单理解
  • rosrun 和 roslaunch 区别
  • [激光原理与应用-205]:光学器件 - LD与DFB的比较
  • JavaWeb03——javascript基础语法