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计数

posted @ 2023-09-22 16:51  C111-CR  阅读(74)  评论(0)    收藏  举报