c++ RAII
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