讲自己作为sharedptr传出_c++ shared_ptr源代码分析(from visual studio 2017)

shared_ptr是通过指针保持对象共享所有权的智能指针。多个shared_ptr对象可占有同一资源,当最后一个shared_ptr对象被销毁或者通过operator=,reset()操作赋予另一指针时,其管理的资源才会被回收。

管理同一资源的不同shared_ptr对象能在不同线程中不加同步的调用其所有成员函数。当然这里指的是shared_ptr对象本身的成员函数,如果你想多线程访问其管理的资源,那么并不会有这种保证。

其成员类型、成员函数与成员变量等在标准中十分明确,在此不再赘述:https://en.cppreference.com/w...。

shared_ptr也可以指定删除器,但与unique_ptr不同的是,该删除器类型并不作为shared_ptr模板中的参数之一。

C++17之前,shared_ptr管理动态分配的数组需要提供自定义的删除器。c++17可以管理动态数组,例如shared_ptr sp(new int[10])。为了支持这一点,element_type现在被定义为remove_extent_t。

话不多说,我们来看它的源代码实现:

c71d0df5d9e83510a53e4b7fb084abc9.png

与unique_ptr不同,shared_ptr并未对管理数组对象特化一个版本。

adda458415814d33453d70df8c0f2b16.png

这个类没有成员变量,其数据存储于基类_Ptr_base<_ty>中,在其成员函数中绝大部分操作也是调用基类提供的函数完成。

接下来我们分析一下_Ptr_base基类的实现。_Ptr_base是一个模板类,模板参数是shared_ptr管理的指针对应的类型。该基类拥有如下这两个数据成员:

26a03bbd600700aaa036eb530c8e540c.png

关于element_type :

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,`unique_ptr`、`shared_ptr`、`weak_ptr`是三种常用的智能指针,用于管理动态分配的内存,避免内存泄漏和悬空指针等问题。 1. `unique_ptr`:是一种独占式智能指针,表示一个对象的所有权只能被一个`unique_ptr`持有,不能被其他指针或引用所共享。当`unique_ptr`超出作用域或被显式释放时,它所指向的对象将被自动销毁。例如: ```cpp std::unique_ptr<int> p(new int(10)); ``` 2. `shared_ptr`:是一种共享式智能指针,表示一个对象的所有权可以被多个`shared_ptr`共享。每个`shared_ptr`维护一个引用计数器,当引用计数器变为0时,它所指向的对象将被自动销毁。`shared_ptr`还支持自定义删除器,可以在对象销毁时执行特定的操作。例如: ```cpp std::shared_ptr<int> p = std::make_shared<int>(10); std::shared_ptr<int> q = p; ``` 3. `weak_ptr`:是一种弱引用智能指针,不能直接访问所指向的对象,只能通过调用`lock()`方法获得一个指向所指对象的`shared_ptr`。当`weak_ptr`所指向的对象已经被销毁时,`lock()`方法将返回一个空的`shared_ptr`。`weak_ptr`主要用于解决`shared_ptr`的循环引用问题,避免内存泄漏。例如: ```cpp std::shared_ptr<int> p = std::make_shared<int>(10); std::weak_ptr<int> q = p; std::shared_ptr<int> r = q.lock(); ``` 这些智能指针都定义在`<memory>`头文件中,并且都是模板类,可以用于管理各种类型的动态分配内存。在实际开发中,应尽量使用智能指针来管理内存,避免手动管理内存所带来的麻烦和风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值