boost學習之RAII機制(資源申請即初始化)

GeekAdo發表於2015-01-09
先介紹下一個專業詞彙:RAII(Resource Application Immediately Initialize)資源申請即初始化。
這也是智慧指標的基本原理,智慧指標只是這個習語的其中一例。智慧指標確保在任何情況下,動態分配的
記憶體都能得到正確釋放,從而將開發人員從這項任務中解放了出來。 這包括程式因為異常而中斷,原本用於
釋放記憶體的程式碼被跳過的場景。用一個動態分配的物件的地址來初始化智慧指標,在析構的時候釋放記憶體,
就確保了這一點。因為解構函式總是會被執行的,這樣所包含的記憶體也將總是會被釋放。
無論何時,一定得有第二條指令來釋放之前另一條指令所分配的資源時,RAII 都是適用的。許多的 C++ 應
用程式都需要動態管理記憶體,因而智慧指標是一種很重要的 RAII 型別。不過 RAII 本身是適用於許多其它
場景的。

下面例子中的這個類就利用了這樣的機制:
它定義了一個名為windows_handle的類,其解構函式呼叫了CloseHandle()函式。這是一個Windows API函式,
因而這個程式只能在Windows上執行。在Windows上,許多資源在使用之前都要求開啟,這意味著資源不再使用
之後就應該關閉。windows_handle 類的機制能確保這一點。它的例項h是以一個控制程式碼來初始化。例子中的
OpenProcess函式沒有什實際意義,就是幫助給類的例項賦值並使用的。重點是通過OpenProcess開啟的資源不
需要顯示的呼叫 CloseHandle來關閉。當然,應用程式終止時資源也會隨之關閉。然而,在更加複雜的應用程
序裡,windows_handle類確保當一個資源不再使用時就能正確的關閉。某個資源一旦離開了它的作用域(上例中
h 的作用域在main函式的末尾)它的解構函式會被自動的呼叫,相應的資源也就釋放掉了。這也就是RAII的精髓
所在。

// boostConsole.cpp : 定義控制檯應用程式的入口點。

#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;

class windows_handle  
{  
public:  
 windows_handle(HANDLE h): handle_(h)  
 {  
  cout<<"windows_handle";
 }  

 ~windows_handle()  
 {  
  cout<<"~windows_handle";
  CloseHandle(handle_);  
 }  

 HANDLE handle() const  
 {  
  return handle_;  
 }  

private:  
 HANDLE handle_;  
};  

int _tmain(int argc, _TCHAR* argv[])
{
 windows_handle h(OpenProcess(PROCESS_SET_INFORMATION, FALSE, GetCurrentProcessId()));  
 SetPriorityClass(h.handle(), HIGH_PRIORITY_CLASS);

 getchar();
 return 0;
}


相關文章