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

C++ 编程指南06 - 不要泄漏任何资源

一:概述

        资源泄漏是指程序在运行过程中分配了某些资源(如内存、文件句柄、网络连接等),但未正确释放或归还,导致这些资源持续占用,无法被其他部分使用。

例如:

  • 动态分配的内存未释放。
  • 打开的文件或网络连接未关闭。
  • 锁未正确释放。

资源泄漏会导致内存占用增加系统资源耗尽,最终可能导致程序崩溃或性能问题。

二:如何避免资源泄露

        (1) 使用 RAII(资源获取即初始化)

        RAII 是 C++ 中一种常见的资源管理习惯,通过对象的构造函数获取资源,析构函数释放资源,确保资源在对象生命周期内安全管理。

#include <fstream>
void writeToFile(const std::string& filename) {
    std::ofstream file(filename); // 构造函数打开文件
    if (!file) throw std::runtime_error("Unable to open file");
    file << "Hello, World!"; // 自动管理文件
} // 离开作用域时,析构函数会自动关闭文件

      (2) 避免裸指针,使用智能指针

        使用智能指针(如 std::unique_ptrstd::shared_ptr)自动管理内存,不需要手动调用 delete

#include <memory>
void process() {
    auto ptr = std::make_unique<int>(42); // 使用智能指针管理动态内存
    // 自动释放内存,无需手动 delete
}

   (3) 避免手动管理资源

      尽量使用标准库或封装好的工具(如容器类或资源管理类)来管理资源,而不是直接使用底层 API。

示例:

  • 使用 std::vector 而不是动态分配数组。
  • 使用 std::thread 而不是直接操作原始线程句柄。

(4) 异常安全

在可能抛出异常的代码中,资源释放逻辑必须是安全的,避免因为异常导致资源未释放。

示例(RAII 避免异常引发的资源泄漏):

void example() {
    std::unique_ptr<int> ptr(new int(42)); // 使用智能指针管理内存
    throw std::runtime_error("Exception occurred"); // 内存不会泄漏
}

 


http://www.kler.cn/a/409768.html

相关文章:

  • Vue 3 动态组件教程
  • kafka是如何做到高效读写
  • Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化
  • golang实现TCP服务器与客户端的断线自动重连功能
  • 第四份工作的环境配置
  • mybatis学习(三)
  • 蓝桥杯每日真题 - 第23天
  • 【C++】C++11新特性详解:可变参数模板与emplace系列的应用
  • World of Warcraft /script SetRaidTarget(“target“, n, ““) n=8,7,6,5,4,3,2,1,0
  • 深入探讨异步 API 的设计与实现
  • [C++]了解内置类型升级
  • Qt 开发笔记
  • 提供html2canvas+jsPDF将HTML页面以A4纸方式导出为PDF后,内容分页时存在截断的解决思路
  • 人工智能学习框架:理论与实践的结合
  • JavaScript网页设计案例:动态交互与用户体验提升
  • 音频档案批量拷贝:专业SD拷贝机解决方案
  • C 语言复习总结记录六
  • Top 10 Tools to Level Up Your Prompt Engineering Skills
  • TCP快速重传机制为啥出现重复ACK?
  • 安全加固方案
  • opencv读写文件操作
  • 谈谈微服务的常用组件
  • 面试题分析: Unity UGUI动静分离
  • Java中使用FFmpeg拉取RTSP流
  • 『 Linux 』网络层 - IP协议 (二)
  • Flink——进行数据转换时,报:Recovery is suppressed by NoRestartBackoffTimeStrategy