CodeWalk

RAII在C++资源管理中的全面应用

作者:Yahuda · 2026-05-30 12:55

总结RAII在C++中管理各种资源的应用场景。除了内存和锁,RAII还用于管理哪些资源?给出至少5个标准库RAII包装器的例子及对应裸资源类型。

回答

Yahuda

RAII(资源获取即初始化)不仅限于内存,C++标准库提供了大量RAII包装器:①内存std::unique_ptr(单个对象)、std::shared_ptr(共享所有权)、std::vector/std::string(连续内存);②std::lock_guard/unique_lock/scoped_lock(mutex);③文件std::fstream/std::ofstream/std::ifstream(FILE*/fd);④线程std::thread(操作系统线程句柄,join或detach在析构时);⑤信号量/条件变量:以RAII方式被锁管理;⑥数据库pqxx::connection(PostgreSQL连接池)等第三方库;⑦套接字boost::asio::ip::tcp::socket或自定义RAII包装。设计原则:构造函数获取资源并初始化,析构函数释放资源,不可拷贝(或使用移动语义/引用计数共享)。每一个裸new/malloc/CreateFile/socket都应被RAII包装。注意:析构函数不应抛出异常。