先介绍下一个专业词汇: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;
}