utn*_*tim 29
没有任何东西(也就是说,我认为你不需要一个完整的教程).
RAII可以很快解释为"每个需要清理的资源都应该提供给对象的构造函数."
换一种说法:
指针应该封装在智能指针类中(例如,请参阅std :: auto_ptr,boost :: shared_ptr和boost :: scoped_ptr).
需要清理的句柄应封装在类中,以便在销毁时自动释放/释放句柄.
同步应该依赖于在作用域退出时释放互斥/同步原语(例如,参见boost :: mutex :: scoped_lock用法).
我不认为你真的可以有关于RAII的教程(不过你可以在设计模式上有一个例子).RAII更像是一种看待资源的方式.
例如,目前我正在使用WinAPI进行编码,我编写了以下类:
template<typename H, BOOL _stdcall CloseFunction(H)>
class checked_handle
{
public:
typedef checked_handle<H,CloseFunction> MyType;
typedef typename H HandleType;
static const HandleType NoValue;
checked_handle(const HandleType value)
: _value(value)
{
}
~checked_handle()
{
Close();
}
HandleType* operator &()
{
return &_value;
}
operator HandleType()
{
return _value;
}
private:
HandleType _value;
void Close(const HandleType newValue = NoValue)
{
CloseFunction(_value);
_value = newValue;
}
};
template<typename H,BOOL _stdcall CloseFunction(H)>
const typename checked_handle<H,CloseFunction>::HandleType
checked_handle<H,CloseFunction>::NoValue =
checked_handle<H,CloseFunction>::HandleType(INVALID_HANDLE_VALUE);
typedef checked_handle<HANDLE,::CloseHandle> CheckedHandle;
typedef checked_handle<HWINSTA,::CloseWindowStation> WinStationHandle;
typedef checked_handle<HDESK,::CloseDesktop> DesktopHandle;
typedef checked_handle<HDEVNOTIFY,::UnregisterDeviceNotification> DevNotifyHandle;
typedef checked_handle<HWND,::DestroyWindow> WindowHandle;
BOOL __stdcall CloseKey(HKEY hKey);
typedef checked_handle<HKEY,CloseKey> RegHandle;
Run Code Online (Sandbox Code Playgroud)
这个类不包括赋值和复制语义(我删除它们以提供一个最小的例子),因此按值返回将导致句柄被关闭两次.
以下是它的使用方法:
类声明:
class Something
{
public:
// ...
private:
WindowHandle _window;
};
Run Code Online (Sandbox Code Playgroud)
这个成员被分配但我从不::CloseWindow(_window._handle)明确地调用(当Something超出范围的实例(如Something::~Something- > WindowHandle::WindowHandle- > ::Close(_window._value))时将调用它.