c++ RAII

发布时间 2023-04-02 21:22:50作者: _Explosion!

c++编程过程中经常出现内存管理问题。对于栈内存我们无需多考虑,其会随着函数的结束而释放,而对于堆内存则需要去手动释放。

最常见的堆内存的创建与释放如下:

auto data=new type;
delete data;
auto data=new type [n];
delete [] data;

对于堆内存的使用,一般步骤即为:获取资源——使用资源——释放资源

当有资源在堆内存申请了空间而又未被释放,那将会产生内存泄漏问题(占用系统内存资源,降低程序运行速率,系统崩溃...);

为了保证时刻能对无用的堆资源进行释放,c++引入了RALL的思想,资源获取即初始化

RAII要求,资源的有效期与持有资源的对象的生命期严格绑定,即由对象的构造函数完成资源的分配(获取),同时由析构函数完成资源的释放。

在这种要求下,只要对象能正确地析构,就不会出现资源泄漏问题。

通常我们会用到智能指针来实现RAII的要求,有了智能指针,一般便无需过多考虑资源的释放。

但是需注意对于一个RAII形的资源来说,当涉及资源所有权的转移时,需注意二次释放问题。(类似于智能指针中的unique_ptr)

有四种常见的资源传递方式

1.值传递,资源所有权直接转移,通常用std::move实现,比如auto A=std::move(B),此时A有了B之前的资源,而B此时无内容;

2.非const引用传递,该资源传递可能会使得被传递对象和传递对象同时指向了一处资源,当二者先后释放时,会产生二次释放,不推荐使用。

3.const引用传递,仅将资源使用权交给const引用,而实际所有权还在原对象手中。

4.右值引用,同第二条,无法确定所有权。

 

参考文章:https://zhuanlan.zhihu.com/p/600337719