More than code

More Than Code
The efficiency of your iteration of reading, practicing and thinking decides your understanding of the world.
  1. 首页
  2. daily
  3. 正文

Daily C/C++ RAII

2021年5月27日 552点热度 0人点赞 0条评论

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空指针是没有问题,他会自己判断对象是否存在

标签: c++
最后更新:2021年5月27日

sheep

think again

点赞
< 上一篇
下一篇 >

文章评论

取消回复

COPYRIGHT © 2021 heavensheep.xyz. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS