RAII
在C++effective一书中讲到,RAII是“Resource acquisition is initialization”,直译为“资源获取就是初始化”。它是基于这样的原理,栈的变量会自动销毁,(自定义类型对象会调用析构函数)。它是将管理资源变为管理对象,将资源封装成类,利用构造函数来获取并初始化资源,析构函数来释放资源,从而保证资源的正确获取,初始化以及释放。从而避免了因此异常等其他措施导致资源得不到释放引起内存泄漏。
RAII的应用:智能指针
RAII的常见应用可能就是智能指针了,我们知道,在C++中可以使用new,delete来申请,释放资源,然而如果出现类似如下的情况:
void fun()
{
int* p = new int(5);
//执行其他函数,函数抛出异常
//other(p);
delete p;
}
注释地方说明,可能由于某些情况,导致fun函数异常退出,这样new出来的资源得不到释放也就是内存泄漏,当然我们可以在外面try。。。catch一下,然而这会导致代码量的膨胀以及逻辑混乱。因此C++为我们提供了智能指针。不管什么原因,只要出了fun函数作用域,就会自动调用析构函数释放资源。
我们会模拟实现以下的智能指针:
//autoptr:管理权的转移(最好不要使用,比较鸡肋)
//scoped ptr:强制防拷贝(针对和指针)
//scoped array:强制防拷贝(针对数组)
//shared ptr:引用计数,通过增减计数器来管理,最后一个对象释放(针对指针)
//shared array:同上,针对数组**
#include <iostream>
//#include <string>
#include <assert.h>
using namespace std;
template<class T>
class AutoPtr //管理权限转移
{
public:
explicit AutoPtr(T* p = nullptr)
: _p(p)
{}
explicit AutoPtr(AutoPtr<T>& other)
: _p(other._p)
{
other._p =