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; //复制
对象语义:不允许复制或者赋值
(全世界不会有两个完全一样的人,程序世界中也不会有两个完全一样的对象)
常用手段:
- 将拷贝构造函数与赋值运算符函数设置为私有的
- 将拷贝构造函数与赋值运算符函数=delete
- 使用继承的思想,将基类的拷贝构造函数与赋值运算符函数删除(或设为私有),让派生类继承基类。
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技术的本质:利用栈对象的生命周期管理资源,因为栈对象在离开作用域时候,会执行析构函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗