什么是智能指针:
智能指针是一个类,用来存储指向动态分配对象的指针,负责自动释放动态分配的对象,防止堆内存泄漏。动态分配的资源,交给一个类对象去管理,当类对象声明周期结束时,自动调用析构函数释放资源。
裸指针的缺点:
1.难区分执行一个或多个对象
2.难以判断是否该销毁,有没有多次销毁
3.难以缺点delete还是delete[]
常见智能指针:
auto_ptr、unique_ptr、shared_ptr、weak_ptr;
auto_ptr在C++11中被舍弃:不支持对象数组操作、赋值和复制会改变资源的所有权。
RAII获取资源即初始化
充分地利用了c++语言局部对象自动销毁的特性来控制资源(内存heap、网络套接字、互斥量,文件句柄等)的生命周期。
RALL过程中的四个步骤
- 设计一个类封装资源
- 在构造函数中初始化
- 在析构函数中执行销毁操作
- 使用时定义一个该类的局部对象
unique_ptr唯一型智能指针
指针、资源一对一。不能两个指针指向一个地址,所以不支持普通赋值和拷贝构造,需要用移动构造和移动赋值。
shared_ptr共享型智能指针
shared_ptr内有两个指针,_Ptr和_Rep;
_Ptr指向申请的空间,_Rep指向_Uses和_Weaks,创建指针后_Uses默认为1、_Weaks默认为1;
_Uses记录有多少个共享指针指向那个空间;
当_Uses值为0时,_Weaks也变为0,释放空间,指针置为空。
weak_ptr弱指针
弱引用指针weak_ptr监视shared_ptr的生命周期,没有*->操作。
weak_ptr需要shared_ptr实例来初始化,同样有_Ptr和_Rep,当创建弱指针时,_Weaks+1
use_count()可以获取当前有几个共享性智能指针指向该资源即_Uses的值。
//创建弱指针
int main()
{shared_ptr<int> pa(new int(10));weak_ptr<int> wp(pa);
}
expired()方法
弱指针 expired()
方法用于检查所指向的对象是否已经被销毁,返回值是一个 bool 类型的变量,如果所指向的对象已经被销毁,则返回 true,否则返回 false。
在某些情况下,我们需要检查所指对象是否还存在,以避免程序出现空指针异常或者未定义行为。这时就可以使用 weak_ptr 的 expired()
方法来判断所指对象是否已经被销毁,从而避免出现访问已经不存在的对象的情况。
lock()方法
lock()方法获取所监视的shared_ptr
弱指针是一种不拥有所指对象的智能指针,它只是对所指对象的一个观察者,因此它不能直接访问所指对象,而是需要通过转换为 shared_ptr 或者使用 lock() 方法获取一个 shared_ptr,然后才可以访问所指对象。
对于lock()返回的共享型智能指针一定要判断一下是否存在,存在与不存在lock都会返回指针。
shared_ptr<int>sp(new int(10));
weak_ptr<int> gw(sp);
shared_ptr<int>spt = gw.lock();
if(spt)
{//使用spt
}