前言
最近对C++的RAII(资源申请初始化),又有了新的理解。
我们C++中使用一个资源(例如 内存)的步骤:
- 申请资源
- 使用资源
- 释放资源
简述一下RAII:
就是可以自动回收资源,将资源封装成对象。
关键在于:
变量的生命周期结束后,会自动释放变量。
例如一个变量是局部变量,存储在栈上,那么当该函数结束后,这个变量就已经被释放掉了。
那么,当变量是类变量的时候,当该类对象变量生命周期结束后,应该调用析构函数释放掉该资源!
生命周期
局部变量:存储在栈上,生命周期结束后,由栈释放。
全局或静态变量:存储在data段,生命周期是整个进程,自动释放。
堆上对象:存储在堆上,生命周期结束后,由编程人员释放。
我们申请内存的时候,就是在申请堆上的资源,所以需要我们手动释放,当我们忘记释放的时候,就会引起内存泄漏!
那么我们通过RAII的思想就可以解决这个问题!
使用栈上对象管理堆上的对象,通过析构函数,就可以确定资源释放的实际!
RAII 举例
实际上智能指针就是利用了RAII的思想。
这里简述一下:
构造函数申请指针资源,然后进行使用,当生命周期结束,析构函数会释放资源!
template<class T>
class smart_ptr
{
public:
smart_ptr()(T* ptr = nullptr)
:_ptr(ptr)
{
// 构造函数
}
~smart_ptr()
{
// 析构函数
if (_ptr)
delete _ptr;
}
//智能指针的第二个特性
T<