Boost智能指针——shared_ptr

boost::scoped_ptr虽然简单易用,但它不能共享所有权的特性却大大限制了其使用范围,而boost::shared_ptr可以解决这一局限。顾名思义,boost::shared_ptr是可以共享所有权的智能指针,首先让我们通过一个例子看看它的基本用法:

#include<string>
#include<iostream>
#include<boost/shared_ptr.hpp>

class implementation
{
public:
    ~implementation() { std::cout <<"destroying implementation\n"; }
    void do_something() { std::cout << "did something\n"; }
};

void test()
{
    boost::shared_ptr<implementation> sp1(new implementation());
    std::cout<<"The Sample now has "<<sp1.use_count()<<" references\n";

    boost::shared_ptr<implementation> sp2 = sp1;
    std::cout<<"The Sample now has "<<sp2.use_count()<<" references\n";
    
    sp1.reset();
    std::cout<<"After Reset sp1. The Sample now has "<<sp2.use_count()<<" references\n";

    sp2.reset();
    std::cout<<"After Reset sp2.\n";
}

void main()
{
    test();
}

该程序的输出结果如下:

The Sample now has 1 references
The Sample now has 2 references
After Reset sp1. The Sample now has 1 references
destroying implementation
After Reset sp2.

可以看到,boost::shared_ptr指针sp1和sp2同时拥有了implementation对象的访问权限,且当sp1和sp2都释放对该对象的所有权时,其所管理的的对象的内存才被自动释放。在共享对象的访问权限同时,也实现了其内存的自动管理。

boost::shared_ptr的内存管理机制:

boost::shared_ptr的管理机制其实并不复杂,就是对所管理的对象进行了引用计数,当新增一个boost::shared_ptr对该对象进行管理时,就将该对象的引用计数加一;减少一个boost::shared_ptr对该对象进行管理时,就将该对象的引用计数减一,如果该对象的引用计数为0的时候,说明没有任何指针对其管理,才调用delete释放其所占的内存。

上面的那个例子可以的图示如下:

  1. sp1对implementation对象进行管理,其引用计数为1
  2. 增加sp2对implementation对象进行管理,其引用计数增加为2
  3. sp1释放对implementation对象进行管理,其引用计数变为1
  4. sp2释放对implementation对象进行管理,其引用计数变为0,该对象被自动删除

boost::shared_ptr的特点:

和前面介绍的boost::scoped_ptr相比,boost::shared_ptr可以共享对象的所有权,因此其使用范围基本上没有什么限制(还是有一些需要遵循的使用规则,下文中介绍),自然也可以使用在stl的容器中。另外它还是线程安全的,这点在多线程程序中也非常重要。

boost::shared_ptr的使用规则:

boost::shared_ptr并不是绝对安全,下面几条规则能使我们更加安全的使用boost::shared_ptr:

  1. 避免对shared_ptr所管理的对象的直接内存管理操作,以免造成该对象的重释放
  2. shared_ptr并不能对循环引用的对象内存自动管理(这点是其它各种引用计数管理内存方式的通病)。
  3. 不要构造一个临时的shared_ptr作为函数的参数。
    如下列代码则可能导致内存泄漏:
    void test()
    {
        foo(boost::shared_ptr<implementation>(new    implementation()),g());
    }
    正确的用法

    void test()
    {
        boost::shared_ptr<implementation> sp    (new implementation());
        foo(sp,g());
    }

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我和这个世界不太熟

我和这个世界不太熟。 这并非是我安静的原因。 我依旧有很多问题&#xff0c; 问他人&#xff0c;问故里&#xff0c;问希望&#xff0c;问距离。我和这个世界不太熟。 这并非是我虚假的原因。 我依旧有很多真诚&#xff0c; 离不开&#xff0c;放不下&#xff0c;活下去&#…

SpringMVC遇到的问题——GET http://localhost/spring_mvc_war_exploded/js/jquery-3.3.1.js net::ERR_ABORTED 404

学习SSM时遇到的问题GET http://localhost/spring_mvc_war_exploded/js/jquery-3.3.1.js net::ERR_ABORTED 404新建了js包&#xff0c;并在包下导入了jquery-3.3.1/js&#xff0c;发布项目后通过浏览器开发者工具 发现报错&#xff0c;信息如下&#xff1a;这个问题的解决方案&…

educoder平台_22个在线平台,2.4万门网课

截至2020年2月2日&#xff0c;教育部组织了22个在线课程平台制定了多样化在线教学解决方案&#xff0c;免费开放包括1291门国家精品在线开放课程和401门国家虚拟仿真实验课程在内的在线课程2.4万余门&#xff0c;覆盖了本科12个学科门类、专科高职18个专业大类&#xff0c;供高…

linspace函数matlab_从零开始的matlab学习笔记——(29)泰勒逼近函数

matlab应用——求极限&#xff0c;求导&#xff0c;求积分&#xff0c;解方程&#xff0c;概率统计&#xff0c;函数绘图&#xff0c;三维图像&#xff0c;拟合函数&#xff0c;动态图....更多内容尽在个人专栏&#xff1a;matlab学习上一节我们成功制作了能自己转圈的三维螺旋…

Boost智能指针——scoped_ptr

boost::scoped_ptr和std::auto_ptr非常类似&#xff0c;是一个简单的智能指针&#xff0c;它能够保证在离开作用域后对象被自动释放。下列代码演示了该指针的基本应用&#xff1a; #include<string> #include<iostream> #include<boost/scoped_ptr.hpp> cla…

设计模式习题

1、设计模式一般用来解决什么样的问题( a) A.同一问题的不同表相 B不同问题的同一表相 C.不同问题的不同表相 D.以上都不是2、下列属于面向对象基本原则的是( c ) A.继承 B.封装 C.里氏代换 D都不是3、Open-Close原则的含义是一个软件实体( a ) A.应当对扩展开放…

点云数据生成三维模型_可直接编辑的高质量3D生成模型:三维深度生成方法SDM-NET...

机器之心发布作者&#xff1a;赵悠悠中科院计算所、香港城市大学、英国卡迪夫大学以及加拿大西蒙弗雷泽大学的研究者&#xff0c;近日提出了一种能够表达几何细节和复杂拓扑结构的三维模型深度生成方法 SDM-NET&#xff0c;解决了之前方法的一部分局限性&#xff0c;使得生成的…

golang调用java的函数_大话golang性能分析(一):profile基本原理

引言&#xff1a;好久没分享了&#xff0c;不多废话了&#xff0c;准备一个专题分三期来分享下golang的性能分析。O 专题目标理解profile基本原理熟悉go常用性能分析工具pprof快速对线上服务的cpu、内存、goroutine的问题进行分析和排查对性能分析&#xff0c;golang是采取采样…

Boost智能指针——weak_ptr

循环引用&#xff1a; 引用计数是一种便利的内存管理机制&#xff0c;但它有一个很大的缺点&#xff0c;那就是不能管理循环引用的对象。一个简单的例子如下&#xff1a; #include<string> #include<iostream> #include<boost/shared_ptr.hpp> #include<b…

Linux下,C++编程论坛题目抽取

从一个论坛主页开始&#xff08;固定的一个&#xff0c;比如学校的论坛&#xff09;&#xff0c;输出各个&#xff08;不用全部&#xff09;板块下若干个主题帖子&#xff08;比如1000个&#xff09;的题目&#xff0c;按功能模块保存在txt文件中。 输入关键词&#xff0c;在上…

lisp eval apply_SICP远古魔法-LISP概览(1-2)

我们之所以能够像今天这样构建丰富多彩的应用是因为&#xff0c;我们有大系统中控制复杂度技术。实际上这种技术在其它领域早已存在。例如造火箭&#xff0c;盖房子。但是计算机科学又和他们不太一样&#xff0c;因为计算机科学处理的不是真实的情况&#xff0c;而是虚拟的。 例…

奥拉星插件flash下载手机版下载安装_终于等到你!安卓微信7.0.13内测版发布 支持夜间模式 附下载地址!...

3月22日&#xff0c;iOS版微信迎来了7.0.12正式版更新&#xff0c;最大的亮点在于为iOS13设备加入了“深色模式”功能&#xff0c;虽然没有独立的控制开关&#xff0c;但可以跟随系统开启或关闭夜间模式。此外&#xff0c;iOS版微信7.0.12还优化了语音消息的发送体验&#xff0…

boost::weak_ptr和enable_shared_from_this

boost::weak_ptr和enable_shared_from_this shared_ptr在我的实践中使用很广,在接口层面上,我基本都会默认的使用shared_ptr.而weak_ptr则很少使用;即便使用,也是间接的使用,例如使得class A继承自boost::enable_shared_from_this,这样A便具有了一个weak_ptr的成员对象,我便可以…

WebSite和Web Application\网站与Web项目的区别

简要记录下&#xff1a;1、web应用程序Default.aspx显示有两个原有文件及Default.aspx.cs和Default.aspx.designer.cs&#xff1b;1、Web网站Default.aspx显示有一个原有文件Default.aspx.cs。 2、web应用程序有重新生成和发布两项&#xff1b;Web网站只有一个发布网站。 3、we…

linux(centos7)安装jdk

一、下载jdk1.8压缩包 官网链接如下&#xff1a; jdk官网 用xftp直接传输文件&#xff0c; 把下载好的jdk压缩包上传到Linux的文件夹下去到我们存放软件的文件夹下面&#xff0c;将刚刚下载好的压缩包通过如下命令进行解压&#xff1a; tar -zxvf jdk-8u321-linux-x64.tar.g…

inner join 和join的区别_left join、right join和join ???

点击上方“JAVA”&#xff0c;星标公众号重磅干货&#xff0c;第一时间送达有个困扰 说到SQL&#xff0c;很多人可能用了挺久&#xff0c;但依然有个问题一直困扰着&#xff0c;那就是 left join、 join、 right join和 inner join等等各种 join的区别。网上搜&#xff0c;最常…

黑马程序员顺义校区php_黑马程序员:从PHP零基础到月薪11K为何送锦旗给班主任?...

2016年我在传智播客学习完PHP以后&#xff0c;特意给班主任王智慧老师送了一面锦旗。为什么我会送锦旗&#xff0c;那是因为从她当我们班主任开始&#xff0c;就非常的负责&#xff0c;对我们非常的好&#xff0c;这个可以随便问问班里的同学。而且我能找到高薪工作跟她对我的鼓…

C++中std::tr1::function和bind 组件的使用

在C的TR1中(Technology Report)中包含一个function模板类和bind模板函数&#xff0c;使用它们可以实现类似函数指针的功能&#xff0c;但却却比函数指针更加灵活&#xff0c;特别是函数指向类的非静态成员函数时。可以参考Scott Meyers. <<Effective C (3rd Edition)>…

linux(centos7)安装MySQL

一、删除MariaDB的文件 通过命令查询MariaDB&#xff1a;rpm -pa | grep mariadb 通过命令删除查找到的程序rpm -e 查找到的文件名 如果删除失败&#xff0c;就通过下面的命令强制删除&#xff1a;rpm -e --nodeps 查找到的文件名 二、安装MySQL 1、安装mysql repo源 …