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;
}


你可能感兴趣的:(C++,boost,RAII机制)