学习C++不能不看的RAII机制,C++内功修炼!

Posted CodeBowl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习C++不能不看的RAII机制,C++内功修炼!相关的知识,希望对你有一定的参考价值。

RAII是C++管理资源的一种方式,可能学习C++很久的人也并不一定熟悉它,但它是十分重要的,我们的智能指针就是基于RAII设计的,所以想要真正学好C++,此类内功一定不能忽略!

什么是RAII?

RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。
怎么做得?
RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源。

为什么要使用RAII?

上面说到RAII是用来管理资源、避免资源泄漏的方法。那么,用了这么久了,也写了这么多程序了,口头上经常会说资源,那么资源是如何定义的?在计算机系统中,资源是数量有限且对系统正常运行具有一定作用的元素。比如:网络套接字、互斥锁、文件句柄和内存等等,它们属于系统资源。由于系统的资源是有限的,就好比自然界的石油,铁矿一样,不是取之不尽,用之不竭的,所以,我们在编程使用系统资源时,都必须遵循一个步骤:

  • 1 申请资源;
  • 2 使用资源;
  • 3 释放资源。

第一步和第三步缺一不可,因为资源必须要申请才能使用的,使用完成以后,必须要释放,如果不释放的话,就会造成资源泄漏。

如何使用RAII?

当我们在一个函数内部使用局部变量,当退出了这个局部变量的作用域时,这个变量也就别销毁了;当这个变量是类对象时,这个时候,就会自动调用这个类的析构函数,而这一切都是自动发生的,不要程序员显示的去调用完成。这个也太好了,RAII就是这样去完成的。
由于系统的资源不具有自动释放的功能,而C++中的类具有自动调用析构函数的功能。如果把资源用类进行封装起来,对资源操作都封装在类的内部,在析构函数中进行释放资源。当定义的局部变量的生命结束时,它的析构函数就会自动的被调用,如此,就不用程序员显示的去调用释放资源的操作了。

使用总结:

当我们在main函数中声明一个局部对象的时候,会自动调用构造函数进行对象的初始化,当整个main函数执行完成后,自动调用析构函数来销毁对象,整个过程无需人工介入,由操作系统自动完成;于是,很自然联想到,当我们在使用资源的时候,在构造函数中进行初始化,在析构函数中进行销毁。整个RAII过程我总结四个步骤:
a.设计一个类封装资源
b.在构造函数中初始化
c.在析构函数中执行销毁操作
d.使用时声明一个该对象的类

思考

为什么局部变量我们不需要申请和释放?
因为局部变量存储在栈上,它的生命周期是由操作系统来管理的,无需人工介入;

在这里插入图片描述
一名新晋打工人的学习进阶之路!
从学生到工程师的蜕变!

以上是关于学习C++不能不看的RAII机制,C++内功修炼!的主要内容,如果未能解决你的问题,请参考以下文章

这次肯定可以看懂C++智能指针,适合新手小白,C++内功修炼

C++ RAII

C++封装互斥锁和基于RAII机制能自动解锁的互斥锁

都说 C++ 没有 GC,RAII: 那么我算个啥?(赠书福利)

C++中RAII和智能指针的区别

0-Linux 网络编程修炼指南——内功心法