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

一:概述

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

例如:

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

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

二:如何避免资源泄露

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

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

cpp 复制代码
#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

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

(3) 避免手动管理资源

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

示例:

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

(4) 异常安全

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

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

cpp 复制代码
void example() {
    std::unique_ptr<int> ptr(new int(42)); // 使用智能指针管理内存
    throw std::runtime_error("Exception occurred"); // 内存不会泄漏
}
相关推荐
cpp_25011 分钟前
P1113 [USACO02FEB] 杂务
数据结构·c++·算法·动态规划·图论·拓扑排序·洛谷题解
此生决int7 分钟前
深入理解C++系列(11)——stack、queue和priority_queue
开发语言·c++
小徐不徐说1 小时前
VS 2022 Visual Assist 破解
c++·visualstudio·工具·插件
郝学胜-神的一滴2 小时前
Qt 高级编程 042:进度条从入门到自定义美化
开发语言·c++·qt·软件开发·用户界面
啦啦啦啦啦zzzz2 小时前
5种IO模型
运维·服务器·网络·c++
呱呱巨基2 小时前
Docker 基础概念学习
linux·c++·学习·docker
郝学胜_神的一滴4 小时前
C++20 高级编程 001:从极简HelloWorld到现代类型体系全梳理
c++·后端
Lazionr4 小时前
list容器详解——双向链表的封装与使用
数据结构·c++·链表·list
Nil2084 小时前
C++ emplace_back 与 push_back 详解
开发语言·c++
漂流瓶jz4 小时前
UVA-12174 Shuffle的播放记录 题解答案代码 算法竞赛入门经典第二版
数据结构·c++·算法·图论·滑动窗口·算法竞赛入门经典·uva