RAII技术

RAII技术

RAII(Resource Acquisition Is Initialization,资源获取即初始化)是一种常见的编程技术,由C++之父Bjarne Stroustrup提出。它的核心思想是将资源(内存资源、文件描述符、文件、锁等)的获取和释放与对象的生命周期绑定。通过这种方式,程序可以更高效地管理资源,减少资源泄漏的风险。

RAII类的常见特征

RAII技术,具备以下基本特征:

  • 在构造函数中初始化资源,或托管资源;

  • 在析构函数中释放资源;

  • 一般不允许进行复制或者赋值(对象语义);

  • 提供若干访问资源的方法(如:读写文件)。

与对象语义相反的就是值语义。

值语义:可以进行复制或赋值(两个变量的值可以相同)

int a = 10; int b = a;  int c = 20;     

c = a; //赋值

int d = c; //复制

对象语义:不允许复制或者赋值

(全世界不会有两个完全一样的人,程序世界中也不会有两个完全一样的对象)

常用手段:

  1. 将拷贝构造函数与赋值运算符函数设置为私有的
  2. 将拷贝构造函数与赋值运算符函数=delete
  3. 使用继承的思想,将基类的拷贝构造函数与赋值运算符函数删除(或设为私有),让派生类继承基类。

RAII类的模拟

可以实现以下的一个类,模拟RAII的思想

template <class T>
    class RAII
    {
        public:
        //1.在构造函数中初始化资源(托管资源)
        RAII(T * data)
            : _data(data)
            {
                cout << "RAII(T*)" << endl;
            }

        //2.在析构函数中释放资源
        ~RAII(){
            cout << "~RAII()" << endl;
            if(_data){
                delete _data;
                _data = nullptr;
            }
        }

        //3.提供若干访问资源的方法
        T * operator->(){
            return _data;
        }

        T & operator*(){
            return *_data;
        }

        T * get() const{
            return _data;
        }

        void set(T * data){
            if(_data){
                delete _data;
                _data = nullptr;
            }
            _data = data;
        }

        //4.不允许复制或赋值
        RAII(const RAII & rhs) = delete;
        RAII& operator=(const RAII & rhs) = delete;
        private:
        T * _data;
    };

如下,pt不是一个指针,而是一个对象,但是它的使用已经和指针完全一致了。这个对象可以托管堆上的Point对象,而且不用考虑delete.

void test0() {
	Point * pt = new Point(1, 2);
	//智能指针的雏形
	RAII<Point> raii(pt);
	raii->print();
	(*raii).print();
}

RAII技术的本质:利用栈对象的生命周期管理资源,因为栈对象在离开作用域时候,会执行析构函数。

posted @   Invinc-Z  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示