C++ | 智能指针
头文件:#include <memery>
首先,对于智能指针,它是无法隐式构造的,不管是unique_ptr,还是shared_ptr,或者是weak_ptr。
即,如果想要初始化一个智能指针,得使用传入参数的形式:
unique_ptr<int> up(new int);
为什么需要使用智能指针呢?
答:为了防止内存泄漏。很多情况下,程序员很容易忘记释放申请来的内存空间。比如说,在一个函数中使用new申请了一块空间,但在完成函数对应的工作后,就忘记了要return之前delete这块空间。又或者,程序员没有忘记写下delete的代码,但程序在执行delete之前抛出了异常,delete将不会被执行,这样也会导致内存泄漏。
因此,引入智能指针这样一系列类,它们使用一个指针来执行构造函数,而当程序脱离了它们的作用域后,智能指针将被析构,而它们的析构函数将会使用delete关键字来释放指针空间。
unique_ptr
对于unique_ptr而言,它具有所有权(ownership)概念,即一个unique_ptr无法复制给另一个unique_ptr,即以下代码是非法的:
unique_ptr<int> up2;
up2 = up; // invalid
unique_ptr<int> up3(up); // invalid
如果想要给一个unique_ptr赋值,=右边得是一个右值,可以是一个新的临时unique_ptr对象,或者使用std::move将另一个unique_ptr变成右值,即:
up2 = unique_ptr<int>(new int);
// 或者:
up2 = std::move(up);
如果想要使用up来初始化up2,得传入转化成右值后的up,而这样会使up失去对对应空间的控制(up将会变成空指针),而up2得到了那块空间的控制权:
unique_ptr<int> up2(std::move(up));
另外,unique_ptr可以传入new []来初始化,因为其支持delete[]的析构函数,而shared_ptr只支持使用了new分配的内存来初始化。
shared_ptr
正如名字那样,shared_ptr指向的那块空间可以被多个shared_ptr分享。
每当多出一个shared_ptr指向那块空间时,其引用计数将加1。
而当最后一个shared_ptr析构时,那块内存才会被释放。
使用 use_count() 来获取当前有多少个shared_ptr引用这片空间。
使用 make_shared 来初始化:
auto sp = make_shared<int>(5);
使用另一个 shared_ptr 来初始化:
shared_ptr<int> sp2(sp);
使用 reset(T *) 来重置 shared_ptr 的指向:
sp.reset(new int(1));
使用 swap() 来与另一个 shared_ptr 交换:
sp.swap(sp2);
weak_ptr
weak_ptr主要是和shared_ptr一起使用,通常使用一个shared_ptr来初始化weak_ptr
shared_ptr<int> sp = make_shared<int>(10);
weak_ptr<int> wp(sp);
-
成员函数
-
expired():判断weak指针所指的空间是否已被释放、或者指针是否为空、或者 是否还有shared指针指向那块空间
被释放/ 空指针/ 没有shared指针指向那块空间 则 返回
true;否则返回
false -
lock():返回一个shared_ptr类型的指针
-
reset、swap:同shared指针
-
use_count:返回shared_ptr的计数。
要注意的是,添加
weak_ptr并不会增加count计数
-

浙公网安备 33010602011771号