一千萬個為什麽

搜索

C ++的RAII教程


我想學習如何在c ++中使用RAII。我想我知道它是什麽,但不知道如何在我的程序中實現它。快速谷歌搜索沒有顯示任何好的教程。

有沒有人有任何好的鏈接教我RAII?

最佳答案

沒有任何東西(也就是說,我認為你不需要一個完整的教程)。

RAII可以很快解釋為“每個需要清理的資源都應該提供給對象的構造函數。”

換一種說法:

指針應該封裝在智能指針類中(例如,參見std :: auto_ptr,boost :: shared_ptr和boost :: scoped_ptr)。

需要清理的句柄應封裝在類中,以便在銷毀時自動釋放/釋放句柄。

同步應該依賴於在作用域退出時釋放互斥/同步原語(例如,參見boost :: mutex :: scoped_lock用法)。

我不認為你真的可以有一個關於RAII的教程(不過你可以在設計模式上有一個例子)。 RAII更像是一種看待資源的方式。

例如,目前我正在使用WinAPI進行編碼,並編寫了以下類:

template
class checked_handle
{
public:
    typedef checked_handle 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
const typename checked_handle::HandleType 
    checked_handle::NoValue = 
    checked_handle::HandleType(INVALID_HANDLE_VALUE);

typedef checked_handle CheckedHandle;
typedef checked_handle WinStationHandle;
typedef checked_handle DesktopHandle;
typedef checked_handle DevNotifyHandle;
typedef checked_handle WindowHandle;

BOOL __stdcall CloseKey(HKEY hKey);
typedef checked_handle RegHandle;

此類不包括賦值和復制語義(我刪除它們以提供最小的示例),因此按值返回將導致句柄被關閉兩次。

以下是它的使用方法:

類聲明:

class Something
{
public:
   //...
private:
    WindowHandle        _window;
};

This member is allocated but I never call ::CloseWindow(_window._handle) explicitely (it will be called when instances of Something go out of scope (as Something::~Something -> WindowHandle::WindowHandle -> ::Close(_window._value) ).

轉載註明原文: C ++的RAII教程

猜你喜歡