再举个Scope Guard设计的例子,C++如何确保异常发生时,也释放了资源,不要用读取文件的例子
时间: 2024-09-30 11:15:24 浏览: 20
C++ 的 Scope Guard 是一种编程技术,通常用于确保在代码块执行结束(包括正常退出或遇到异常)时,一定会执行某个清理操作。这种技术尤其适用于那些需要在特定上下文中管理资源的情况,比如文件、数据库连接等。当使用 Scope Guard 时,如果发生异常,资源会被自动关闭,避免了资源泄露的问题。
以下是一个简单的 Scope Guard 示例,使用 `std::shared_ptr` 和 `std::lock_guard` 来确保文件句柄在任何时候都会被正确地关闭:
```cpp
#include <fstream>
#include <memory>
class FileOpener {
public:
explicit FileOpener(const std::string& filename) : file_(filename) {
if (!file_) {
throw std::runtime_error("Failed to open file");
}
lock_ = std::make_unique<std::lock_guard<std::mutex>>(mutex_);
}
~FileOpener() { // 自动调用,即使有异常
if (lock_) {
file_->close();
}
}
private:
std::ifstream file_;
std::unique_ptr<std::lock_guard<std::mutex>> lock_; // 锁住资源直到析构
mutable std::mutex mutex_; // 为了并发控制,假设多个实例可能同时打开文件
};
int main() try {
FileOpener opener("example.txt");
// 文件操作...
} catch (...) {
// 处理异常
}
```
在这个例子中,`FileOpener` 类构造时打开了文件并获取了锁。当对象生命周期结束时(不论是正常结束还是由于异常),`~FileOpener()` 被调用,其中的 `file_->close()` 会确保文件被安全关闭。
阅读全文