Skip to the content.

cpp RAII

RAII 是 Resource Acquisition Is Initialization

也就是释放对象,那么自动释放关联的资源

为什么需要 RAII 在 C/C++ 中,像内存、文件句柄、网络连接、锁这样的资源,如果手动管理(申请后忘记释放),很容易导致: • 内存泄漏 • 资源耗尽 • 异常安全漏洞(发生异常时跳过了释放代码) RAII 通过利用 C++ 的构造函数和析构函数机制,确保资源无论函数是正常返回还是异常退出,都一定会被正确释放。

典型示例

  1. 智能指针(管理动态内存)
 #include <memory>

 void foo() {
     std::unique_ptr<int> ptr(new int(42));  // 构造时分配内存
     // 使用 ptr...
     // 函数退出时(无论正常返回还是异常),ptr 的析构函数自动释放内存
 }  // 自动 delete

  1. std::lock_guard(管理互斥锁) #include

std::mutex mtx;

void thread_safe_func() { std::lock_guard<std::mutex> lock(mtx); // 构造时加锁 // 临界区代码… } // 析构时自动解锁,即使发生异常也会解锁

  1. std::fstream(管理文件句柄) #include

void write_file() { std::ofstream file(“data.txt”); // 构造时打开文件 file « “hello”; } // 析构时自动关闭文件

  1. 自定义 RAII 类 class FileHandle { FILE* file; public: FileHandle(const char* name, const char* mode) { file = fopen(name, mode); } ~FileHandle() { if (file) fclose(file); // 保证文件会被关闭 } // 禁止拷贝,允许移动(省略) }; ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 总结 特性 说明 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 核心思想 资源获取即初始化,资源释放即销毁 依赖机制 C++ 的构造函数和析构函数 主要优势 异常安全、避免泄漏、代码简洁 常见应用 智能指针、锁守卫、文件句柄、数据库连接等

RAII 被认为是 C++ 中最重要、最优雅的惯用法之一,现代 C++ 编程强烈建议遵循此原则。

RAII

https://stackoverflow.com/questions/2321511/what-is-meant-by-resource-acquisition-is-initialization-raii

并不是什么高级功能

为什么叫做 https://en.cppreference.com/w/cpp/language/move_constructor 为什么 move 需要 noexcept

所以,lvalue xvalue prvalue 是纯粹的

glvalue = lvalue + xvalue rvalue = xvalue + prvalue

rvalue can be moved, either because it’s a temporary (prvalue) or explicitly moved (xvalue)

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。