程序员笔记 (六十三)C++11智能指针之std::shared_ptr


外向笑小鸭子
外向笑小鸭子 2024-01-12 14:16:10 52354 赞同 0 反对 0
分类: 资源 标签: 运维
程序员笔记 (六十三)C++11智能指针之std::shared_ptr

std::shared_ptr是在c++11中引入的一种智能指针,其特点是它所指向的资源具有共享性,即多个shared_ptr可以指向同一份资源。在c++中使用shared_ptr需要包含<memory>头文件。

(一)定义并初始化一个共享指针的三种方式:

1通过new运算符或者普通指针

shared_ptr<Investment> sp(newInvestment());

Investment * pInvestment = new Investment();

shared_ptr<Investment> sp (pInvestment);

2通过make_shared方法

auto sp1 = std::make_shared<Investment>();

3通过拷贝另一个智能指针

shared_ptr<Investment> sp2(sp);

//或者

shared_ptr<Investment> sp3 = sp2;

(二)shared_ptr的结构

相比于普通指针,共享指针要占用多一倍的内存空间,其内部包含两个指针,一个指针指向它所管理的资源,第二个指针指向一个称为“Control Block”的控制块,如图所示:

图片

通过上图所示的结构,我们可以知道在控制块中有一个引用计数字段(Reference Count),用来记录指向Object的共享指针数量,当我们声明并初始化一个共享指针时,Reference Count的值为1,当有另一个共享指针指向该Object时(比如通过赋值或拷贝构造函数,将一个共享指针赋值给另一共享指针),Reference count 的值递增1。

      第二个字段:Weak Count,也是一个引用计数,它用来计数指向该Object的std::weak_ptr指针的数量,关于std::weak_ptr我们将在下一章节讨论。

      引用计数的存在使得std::shared_ptr有一些比较特别的特性:

Std::shared_ptr的大小两倍于普通指针。

控制块必须是动态分配的,这是由于被shared_ptr所管理的对象并不知道有“引用计数”的存在,所以在被管理对象中并没有空间来存储这个引用计数。

引用计数的增减必须是原子性的,否则在多线程环境下,由于线程竞争的存在,会导致对Reference count的脏读、脏写。

(三)资源释放

    shared_ptr默认情况下使用delete释放资源,但是用户也可以指定自己的资源释放函数,例如在下面这个例子中,pInvest用delete_Investment进行资源释放操作:

   资源释放器的地址存放于控制块(Control Block)中,因此增加用户自定义的资源释放器不会增加shared_ptr的大小,其大小仍然为两个指针的大小。

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
外向笑小鸭子L0
粉丝 0 资源 87 + 关注 私信
最近热门资源
银河麒麟桌面操作系统备份用户数据  123
统信桌面专业版【全盘安装UOS系统】介绍  116
银河麒麟桌面操作系统安装佳能打印机驱动方法  108
银河麒麟桌面操作系统 V10-SP1用户密码修改  101
最近下载排行榜
银河麒麟桌面操作系统备份用户数据 0
统信桌面专业版【全盘安装UOS系统】介绍 0
银河麒麟桌面操作系统安装佳能打印机驱动方法 0
银河麒麟桌面操作系统 V10-SP1用户密码修改 0
作者收入月榜
1

prtyaa 收益393.62元

2

zlj141319 收益217.85元

3

1843880570 收益214.2元

4

IT-feng 收益208.98元

5

风晓 收益208.24元

6

777 收益172.71元

7

Fhawking 收益106.6元

8

信创来了 收益105.84元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79.5元

请使用微信扫码

加入交流群

请使用微信扫一扫!