深入理解shared

您所在的位置:网站首页 sharedptr头文件 深入理解shared

深入理解shared

2023-10-18 07:17| 来源: 网络整理| 查看: 265

前言

智能指针是一种可以自动管理内存的指针,它可以在不需要手动释放内存的情况下,确保对象被正确地销毁,防止内存泄漏和悬空指针的出现。上一篇文章主要分析了C++11中的三个智能指针:shared_ptr、weak_ptr和unique_ptr的用法和一些陷阱,其中在平时项目中用的最多的就是shared_ptr,此文就深入剖析一下shared_ptr的背后实现原理。并尝试手写出简易的shared_ptr和weak_ptr。

一、 shared_ptr的思想

shared_ptr的关键特性就是共享所有权,多个指针可以指向相同的对象。当最后一个指向该对象的指针被销毁或者释放对对象的所有权的时候,对象就会自动被释放。

这种特性是通过引用计数来实现的。 shared_ptr是一个模板类,类里面有一个成员专门用来记录有多少个shared_ptr共享一个对象。

shared_ptr简单用法:

image.png

shared_ptr和make_shared都会包含在memory头文件中。

二、shared_ptr的拷贝和赋值

当进行拷贝和赋值操作的时候,每个shared_ptr都会记录有多少个其他的shared_ptr指向相同的对象:

auto p = make_shared(42); auto q(p);

我们可以认为每个shared_ptr都有一个引用计数,就是一个关联的计数器。

无论何时当我们拷贝一个shared_ptr,计数器都会递增。 比如,用一个shared_ptr初始化另一个shared_ptr,或者将其作为函数参数传递给一个函数,或者作为函数的返回值,他所关联的引用计数就会递增。

当我们把shared_ptr赋予一个新的shared_ptr或者shared_ptr被销毁,或者shared_ptr离开其作用域的时候,引用计数就会递减。

当一个shared_ptr的引用计数减为0的时候,他就会释放自己所管理的对象。

auto p1 = make_shared(4); auto p2 = make_shared(3); p1 = p2;

注意,在上面的例子中,我们创建了两个智能指针,然后给p1赋值,令p1指向另一个地址,也就是让他去管理另一个对象。 这里我们就要递增p2指向的对象的引用计数,递减p1指向的对象的引用计数。如果p1原来的对象已经没有引用者了,那就释放。

三、使用shared_ptr的陷阱

下面看一个例子:

#include #include #include #include using namespace std; class Company;//前置声明,公司类 //创建worker类 class Worker { public: Worker() { cout


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3