[笔记] C++ RAII(资源获取即初始化)


何为RAII

RAII(Resource Acquisition Is Initialization)是由Bjarne Stroustrup提出的一种使用局部对象来管理资源(内存,文件,网络)的方式

资源回收

资源回收一直是一个令人头疼的问题,人们总是在new Class()后忘了在正确的地方delete它,仅仅是因为这种小问题,人们也做不好。在工程中,为了解决"人这种生物的能力是有极限的"这种问题,提出了几种回收资源的方式:

  • 手动管理
  • 垃圾回收(Garbage Collection, GC)
  • RAII/所有权模式

垃圾回收多用在动态语言中,它虽然解决了回收问题,但带来了不少的性能损失。
而作为零损耗抽象的C++,其创始人提出了RAII模式,利用系统堆栈在结束时(可形象的理解为一对大括号结束}的时候)自动释放资源的机制来实现半自动回收

示例

在构造函数中获得资源,在析构函数中释放资源,利用C++语言局部对象自动销毁的特性来自动释放

#include 
#include 

using namespace std;

class RAII
{
	
public:
	char* ptr;

	RAII()
	{
		ptr = (char*) malloc(sizeof(*ptr) * 64);
		cout << format("malloc {:#x}", (uint64_t) ptr) << endl;
	}
	~RAII()
	{
		free(ptr);
		cout << format("free {:#x}", (uint64_t) ptr) << endl;
	}
};


int main()
{
	auto raii = RAII();
	return 0;
}