C 11 shared_ptr概念及用法

基本概念

  • shared_ptr 是C 11提供的一种智能指针类,主要用于消除内存泄漏和悬空指针的问题,方便资源的管理,自动释放没有指针引用的资源.

  • shared_ptr的大小是原始指针的两倍,因为它的内部有一个原始指针指向资源,同时有个指针指向引用计数.

所在库

C 11模板库

#include <memory>shared_ptr<T> ptr(new T);  // T 可以是 int、char、类等各种类型

GNU G 的标准库中还没有支持,需使用boost

#include <boost/shared_ptr.hpp>

内存

每个 shared_ptr 对象在内部指向两个内存位置

  • 指向对象的指针

  • 用于控制引用计数数据的指针

计数变化规则

  • 当新的 shared_ptr 对象与指针关联时,则在其构造函数中,将与此指针关联的引用计数增加1。

  • 当任何 shared_ptr 对象超出作用域时,则在其析构函数中,它将关联指针的引用计数减1。如果引用计数变为0,则表示没有其他 shared_ptr 对象与此内存关联,在这种情况下,它使用delete函数删除该内存

  • 引用计数加一/减一操作是原子性的,所以线程安全的
    使用以下方法可检查 shared_ptr 对象的引用计数

ptr.use_count();

构造方法

(1)使用空参数构造函数构造

std::shared_ptr<T> ptr;

这样构造的话,ptr 的意义就相当于一个 NULL 指针。当试图在一个空指针上做类似于 *ptr 或者 ptr->xx 之类的东西的时候,会出现异常错误
(2)直接从 new 操作符的返回值构造

std::shared_ptr<T> ptr(new T()); //引用计数加 1

(3) 使用make_shared方法

std::shared_ptr<T> p1=std::make_shared<T> (); //引用计数加 1

(4)复制构造函数

std::shared_ptr<T> ptr2(ptr1);    // 这就是使用复制构造函数的方法,引用计数加 1

shared_ptr 可以当作函数的参数传递,或者当作函数的返回值返回,这个时候其实也相当于使用复制构造函数。
过程如下:作函数实参时,将指针执行复制构造函数传入函数体内,因此该内存块的引用计数 1;
当作为函数返回值时,复制构造函数将内存地址传递给新指针,引用计数 1,然后,局部指针执行析构,引用计数-1。

(0)

相关推荐

  •  C++11中shared

    在C++中,动态内存的管理是通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,可以选择对对象进行初始化:delete,接受一个动态对象的指针,销毁该对象,并释放与之 ...

  • C++内存管理之shared

     ----------------------------------------shared_ptr--------------------------------------- 引子 c++中动态 ...

  • 现代C一文读懂智能指针

    https://m.toutiao.com/is/JHS4MVf/ 智能指针 C++11 引入了 3 个智能指针类型: std::unique_ptr<T> :独占资源所有权的指针. st ...

  • 11种中成药的用法

    ​这11种中成药因为太便宜了,现在医院很少能开到了,建议可收藏备用! 1.[痰多湿重]--常用--六君子丸: 补脾益气,燥湿化痰.常用于脾胃虚弱,食量不多,气虚痰多,腹胀便溏 2.[阴虚火旺]--常用 ...

  • 2.11 n函数的用法

    2.11 n函数的用法

  • 本花的答题挚爱:批判学派的概念与用法 | 基础知识应试串讲系·第二期

    不瞒大家说,如果上次梳理的经验学派更适合用来查漏补缺温故而知新的话,那么今天梳理的批判学派,就可以让大家以更加深刻.更加有逼格以及更加学理和人文的视角来看待时下诸多社会现状与问题. 学术一点的叫做&q ...

  • S7-300/400:外设寻址的概念、用法及其应用特点

    一. 外设寻址 与过程映像区不同,外设寻址是指直接访问外设模块.外设寻址不能对外设进行位寻址, 要求必须至少以字节为单位进行数据读写,即可以字节.字或者双字为单位进行寻址.其格式如下: PIB(Per ...

  • 基础中的基础:光圈的概念和用法

    数码相机的光圈理论上相当于人眼球里的虹膜. 如果光圈开得很大,就会有大量的光线进入影像感应器:相反地,如果光圈几乎处于闭合的状态,那么进光量就会相对减小很多. 光圈数值是一个比值(分数),表示为1:2 ...

  • 初二数学:人教版初二上因式分解提公因式的概念及用法

    初二数学:人教版初二上因式分解提公因式的概念及用法

  • 2021/1/11 芯片概念中...

    2021/1/11 芯片概念中受到机构关注度的个股 简称 机构目标价90天(元) 京东方A 7.64 韦尔股份 241.25 华润微 74.48 格力电器 73.30 比亚迪 229.18 卓胜微 5 ...

  • 标点符号会用吗?带你了解11种符号的用法,几分钟掌握使用技巧

    标点符号会用吗?带你了解11种符号的用法,几分钟掌握使用技巧

  • 5月11日热点概念与题材前瞻(附股)

    [牧童资讯●热点前瞻] 中国卫星导航年会倒计时.北斗导航题材迎密集事件催化 中科星图(688568)致力于打通卫星资源与应用的产业链路,公司自主研发的GEOVIS数字地球产品,实现了高分遥感卫星.商业 ...