我需要一个用于异常安全资源管理的Scope Guard类,它很简单并且使用C ++ 11特性。
对于传统的C风格API,第一选择是设计一个包装类来在ctor / dtor中分配/清理资源。如果这样的努力太多,那么范围保护应该用作简单的遗留API包装器。范围保护声明应紧跟其资源分配计数器部分(例如fopen())。
答案 0 :(得分:4)
There is proposal to include scope_exit
and 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
也可以这样做,但不是非常可怕。