【C++】《C++ 17 入门经典》读书笔记 11 ---- 智能指针:unique_ptr、shared_ptr、weak_ptr

智能指针类型由标准库的 memory 头文件中的模板定义,所以必须在源文件中包含这个文件,才能使用智能指针。

std 名称空间中定义了 3 种智能指针:

1、unique_ptr<T>

unique_ptr<T>对象类似于指向 T 类型的指针,是唯一的,这表示不能有多个 unique_ptr<T> 对象保存相同的地址。换句话说,从不会有两个或更多个 unique_ptr<T> 对象同时指向相同的地址。

unique_ptr<T> 对象独占地拥有指向的内容。编译器通过不允许复制 unique_ptr<T> 来强制这种唯一性。

2、shared_ptr<T>

shared_ptr<T> 对象类似于指向 T 类型的指针,但与 unique_ptr<T> 不同,可以有任意多个 shared_ptr<T> 对象包含或共享相同的地址。因此, shared_ptr<T> 对象允许共享自由存储区中对象的所有权。

在任何给定时刻,运行时知道包含给定地址的 shared_ptr<T> 对象的个数,称为引用计数。

每次创建包含给定自由存储区地址的新 shared_ptr<T> 对象时,包含该地址的 shared_ptr<T> 的引用计数会递增; 包含该地址的 shared_ptr<T> 对象被释放或指向另一个地址时,该引用计数会递减。

没有包含给定地址的 shared_ptr<T> 对象时,引用计数为 0,位于该地址的对象的内存会自动释放。指向相同地址的所有 shared_ptr<T> 对象都可以访问引用计数。

扫描二维码关注公众号,回复: 6765636 查看本文章

3、weak_ptr<T>

weak_ptr<T> 被链接到 share_ptr<T> 上,包含相同的地址。创建 weak_ptr<T> 不会递增所链接的 shared_ptr<T> 对象的引用计数,所以不能防止它指向的对象被释放。引用它的最后一个 shared_ptr<T> 对象被释放或重置为指向另一个地址时,即使链接的 weak_ptr<T> 对象仍存在,其内存也会释放。即使发生这种情况, weak_ptr<T> 也不会包含悬挂指针,至少不会包含程序员会无意访问的指针。原因在于,程序员不能直接访问 weak_ptr<T> 封装的地址。

编译器会强制首先从 weak_ptr<T> 创建一个 shared_ptr<> 对象来引用相同的地址。

如果 weak_ptr<T> 引用的内存地址依然有效,强制创建 shared_ptr<T> 首先会确保引用计数再次递增,并且指针可再次被安全使用。但是,如果内存已经释放,创建 shared_ptr<T> 将包含 nullptr。

建议:使用 vector<T> 容器而不是 unique_ptr<T[]>,因为该容器类型比智能指针强大得多,也灵活得多。


猜你喜欢

转载自blog.csdn.net/kingkee/article/details/94214704