回答
沒有什麼(也就是說,我不認爲你需要一個完整的教程)。
RAII可以簡短地解釋爲「每個需要清理的資源都應該被賦予一個對象的構造函數。」
換句話說:
指針應在智能指針類被封裝(見的std :: auto_ptr的,升壓:: 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;
本類不包括分配和複製語義(我刪除他們提供一個最小的例子)所以按值返回,會導致手柄關閉兩次。
這裏是如何使用它:
類聲明:
class Something
{
public:
// ...
private:
WindowHandle _window;
};
該成員分配,但我從來沒有叫::CloseWindow(_window._handle)
明確地(當Something
實例走出去的範圍將被調用(如Something::~Something
- >WindowHandle::WindowHandle
- >::Close(_window._value)
)。
這也可以使用boost :: shared_ptr與自定義釋放器完成。例如,'boost :: shared_ptr
好點,但我至少會用一些typedef-ing來寫。我不喜歡用一個名爲「shared_ptr」的類來做別的東西,而不是指針。 它導致維修中的道路混亂。 – utnapistim 2010-04-26 15:12:13
從某種意義上說,句柄是一個指針。它是使用原始數據類型的一些資源的表示(即它通常指向使用整數的資源)。 – 2013-08-16 15:50:03
wikipedia解釋不錯。
我個人發現對RAII主題最有幫助的參考書是Herb Sutter的書Exceptional C++。
這本書中涵蓋的許多主題在Sutter的每週一文中都有涉及。這些文章可從http://gotw.ca/gotw/index.htm獲得。
Exceptional C++的哪一章涵蓋了RAII的主題? – Javier 2011-02-17 14:57:16
"Effective C+"的第13項也很實用
- 1. RAII和C++ STL
- 2. ActiveMQ C++教程
- 3. directx教程C++
- 4. Objective-C教程
- 5. C++ RPC教程?
- 6. Linux的C/C++ RPC教程
- 7. 的Qt WebKit的教程C++
- 8. Acrobat SDK C#教程
- 9. 的Java教程C#開發
- 10. Qt編程教程(C++)?
- 11. C++多線程教程
- 12. .NET的RAII-Wrapper?
- 13. C/C++/C#TCP/IP和網絡編程(多平臺)的教科書或教程
- 14. 關於C++的機器語言教程教程
- 15. C#中的2D遊戲編程教程#
- 16. C編程教程的問題集
- 17. 是std :: unique_ptr RAII的應用程序嗎?
- 18. Objective-C OpenGL遊戲教程
- 19. Objective-C日曆教程
- 20. 鍵盤事件教程C#
- 21. C++/Win32教程推薦?
- 22. Visual C#教程ASP.NET MVC 2
- 23. MVC - C#,ASP.net:教程通緝
- 24. C#web開發教程
- 25. Wt教程(C++ Web開發)
- 26. ffmpeg C API文檔/教程
- 27. RAII和分配
- 28. RAII在計劃?
- 29. ModelResetter RAII對象
- 30. 在C/C++中尋找GD教程
不是外部鏈接,但你可以在這裏找到一些很好的答案:http://stackoverflow.com/questions/395123/raii-and-smart-pointers-in-c – Naveen 2010-04-14 08:28:13
@Naveen - 謝謝,那個沒有當我在我的標題中輸入時顯示在我的鏈接中 – 2010-04-14 08:29:01
@Joe Bloggs:我使用谷歌網站:stackoverflow.com。它產生更好的結果。 – Naveen 2010-04-14 08:30:06