RAII
先把原文章贴在前面,可以先看原文章有了自己的理解,再来看我说的补充
RAII(Resource Acquisition Is Initialization)
一些背景的介绍就不多说了,网上讲这个的貌似也不少,这里就说一说自己的理解吧
资源的获取即初始化,其实直观的来说,就是new的组合
记得之前我有一篇文章讲new,当我们在c++中new一个对象的时候,他会首先用operator new来进行空间的分配,然后再执行对象的构建,当分配不成功的时候,对象也不会被成功的构造,这就是RAII直接的意思
我们把资源的获取与在上面构造对象的过程结合到了一起
看wiki上有这么说,保证资源是类的一个不变量,资源是与对象的生存期相关联的,获取资源的时候对象构造,释放资源的时候对象就会析构,所以只要对象没有泄露,资源就不会泄露
然后说一下RAII的用处,有时候我们不能将对象直接的在栈上进行构造,或者我们需要储存的是指针(考虑派生类,多态的情况),那么这时候我们要怎么保证资源的析构呢
用局部对象来管理资源的技术就是RAII,因为C++会自动销毁局部特性
结合这个特性,我们可以用一个wrapper来包装我们的资源
贴一下文章中的代码
class shape_wrapper {
public:
explicit shape_wrapper(
shape* ptr = nullptr)
: ptr_(ptr) {}
~shape_wrapper()
{
delete ptr_;
}
shape* get() const { return ptr_; }
private:
shape* ptr_;
};
void foo()
{
…
shape_wrapper ptr_wrapper(
create_shape(…));
…
}
这样我们把要管理的资源放到wrapper中,在函数的结束时刻,编译器将会自动析构wrapper,也就可以帮我们释放他管理的资源
还有一个小tip,delete空指针是没有问题,他会自己判断对象是否存在
文章评论