boost學習之RAII機制(資源申請即初始化)
先介紹下一個專業詞彙: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;
}
相關文章
- boost學習之Boost.Lambda
- ITPUB專家博主申請機制
- Redis學習之管道機制Redis
- OpenYurt 開源之夏開始申請啦
- RAII:C++資源管理的利器(轉)AIC++
- IOS學習之NSNotificationCenter訊息機制iOS
- 學習資料庫索引機制資料庫索引
- Java 反射機制學習資料Java反射
- Flutter學習之事件迴圈機制、資料庫、網路請求Flutter事件資料庫
- android 6.0許可權申請機制(簡單案例)Android
- Vue原始碼學習之資料初始化Vue原始碼
- 【C++設計技巧】C++中的RAII機制C++AI
- 又一資料庫公司即將上市,Couchbase提交IPO申請資料庫
- 請查收.NET MAUI 的最新學習資源UI
- RAII慣用法:C++資源管理的利器AIC++
- Halo 開源專案學習(七):快取機制快取
- boost庫學習筆記筆記
- android強制申請許可權Android
- 大資料學習資源之DataCamp大資料
- 每天學習一點JVM之:垃圾回收機制JVM
- Android學習之 Touch事件傳遞機制Android事件
- Halo 開源專案學習(六):事件監聽機制事件
- bash初始化機制
- boost.coroutine學習筆記筆記
- Qt 事件機制 學習QT事件
- Go基礎學習記錄之反射(reflect)機制Go反射
- Java學習之反射機制及應用場景Java反射
- 每天學習一點 JVM 之:類載入機制JVM
- Boost Test學習總結(C++)C++
- GGTalk 開源即時通訊系統原始碼剖析之:聊天訊息防錯漏機制原始碼
- Python入門學習之異常處理機制Python
- MySQL學習系列之InnoDB下事務隔離機制MySql
- iOS學習筆記21 推送證書與祕鑰申請iOS筆記
- Android資源訪問機制Android
- 移動電源申請CB認證標準及所需資料
- React 學習資源React
- 學習資源整理
- Haskell學習資源Haskell