使用C ++ 11进行异常安全资源管理的真实世界Scope Guard

时间:2015-11-07 23:34:49

标签: c++ c++11

我需要一个用于异常安全资源管理的Scope Guard类,它很简单并且使用C ++ 11特性。

对于传统的C风格API,第一选择是设计一个包装类来在ctor / dtor中分配/清理资源。如果这样的努力太多,那么范围保护应该用作简单的遗留API包装器。范围保护声明应紧跟其资源分配计数器部分(例如fopen())。

2 个答案:

答案 0 :(得分:4)

There is proposal to include scope_exitand unique_resource,我认为它已被接受。您可以轻松find implementations on github

unique_resource是专门为您的资源管理用例定义的:

auto hFile = std::make_unique_resource_checked(
    CreateFile("test.tmp",
               FILE_ALL_ACCESS,
               FILE_SHARE_READ,
               OPEN_EXISTING,
               FILE_ATTRIBUTE_NORMAL,
               nullptr), // The resource
    INVALID_HANDLE_VALUE, // Don’t call CloseHandle if it failed!
    CloseHandle); // Clean-up API, lambda-friendly position

答案 1 :(得分:2)

简短的回答是:不要。使用ScopeGuard管理资源是一种巨大的反模式。它的RAII但严格低劣。这是一个完全虚假的经济。

当你在一个地方使用一个给定的资源时,范围保护工作,即使这样,带有功能删除器的unique_ptr也可以这样做,但不是非常可怕。