当前位置: 首页 > 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.lryc.cn/news/614973.html

相关文章:

  • 可泛化双手操作机器人基准测试:CVPR 2025 MEIS 研讨会 RoboTwin 双臂协作挑战赛
  • 【渲染流水线】[几何阶段]-[图元装配]以UnityURP为例
  • 第15届蓝桥杯Scratch选拔赛初级及中级(STEMA)2024年1月28日真题
  • Leetcode-19. 删除链表的倒数第 N 个结点
  • ORA-600 kcratr_nab_less_than_odr和ORA-600 4194故障处理---惜分飞
  • 莫比乌斯反演学习笔记
  • FFMPEG将H264转HEVC时,码率缩小多少好,以及如何通过SSIM(Structural Similarity Index结构相似性指数)衡量转码损失
  • PDF编辑工具,免费OCR识别表单
  • .htaccess 文件上传漏洞绕过总结
  • springBoot集成easyExcel 实现文件上传
  • linux安装php
  • 模板引擎art-template
  • 深入剖析Spring MVC核心原理:从请求到响应的魔法解密
  • AI 算法优化实战指南:从理论到部署的全流程优化策略
  • K-means聚类学习:原理、实践与API解析
  • 从反射到方法句柄:深入探索Java动态编程的终极解决方案
  • 从零玩转Linux云主机:免费申请、连接终端、命令速查表
  • 灾后食物能源协调供应优化模型
  • 《算法导论》第 15 章 - 动态规划
  • 基于开源AI大模型、AI智能名片与S2B2C商城小程序的学习型社群构建与运营模式创新研究
  • rem:CSS中的相对长度单位
  • IntelliJ IDEA 新手全方位使用指南
  • 网站站长如何借助php推送示例提交网站内容加速百度收录?
  • webwork的学习
  • 7天精通Coze智能体实操手册(Day 1)
  • Go语言实战案例:表单提交数据解析
  • Express中间件和路由及响应方法
  • golang的二维数组
  • vulnhub-Beelzebub靶场通关攻略
  • Nginx 功能扩展与二次开发实践