当前位置: 首页 > news >正文

婚庆网站策划书徐州网站关键词排名

婚庆网站策划书,徐州网站关键词排名,召开网站建设培训会,织梦网站采集侠怎么做shared_ptr shared_ptr继承自__shared_ptr,其中有两个对象,一个是指向资源的指针,一个是控制块,指向一个引用计数对象。控制块中存储了强引用和弱引用的计数,强引用Uses代表shared_ptr对象的引用计数,弱引…

shared_ptr

shared_ptr继承自__shared_ptr,其中有两个对象,一个是指向资源的指针,一个是控制块,指向一个引用计数对象。控制块中存储了强引用和弱引用的计数,强引用Uses代表shared_ptr对象的引用计数,弱引用Weaks代表weak_ptr对象的引用计数。
在这里插入图片描述
大概结构如上图所示,控制块其中也存储了指向资源的指针。
因此在构造一个shared_ptr对象的时候,会有两次堆分配,一次是为资源分配,一次是为控制块分配。因为每一个指向这份资源的指针对象都需要看到同一份引用计数,因此跟资源一样也是堆分配的。多次的堆分配和释放也就代表效率上的损失,而且极易产生内存碎片。

make_shared

C++11同时提供了make_shared函数,这是通过构造一个shared_ptr对象,而这个对象会事先申请一块足够大的内存空间,用于存放管理的资源以及控制块。即分配的堆空间是连续的,因此只有一次堆内存分配。

在这里插入图片描述
内存的结构就从左边的构造shared_ptr对象到右边的重构对象资源指针和引用计数。
相比shared_ptr构造,减少一次内存分配,提高效率,并且内存空间连续,减少内存碎片产生。但是,make_shared也存在缺点。

make_shared的缺点

自定义deleter

make_shared在构造智能指针对象的时候不能自定义deleter。在创建对象时同时创建控制块,这个控制块内部包含了引用计数、deleter等与管理资源相关的信息。因为资源和控制块是属于同一块申请的内存,所以使用自定义deleter可能会导致控制块内存被不正确地释放。因此,如果要使用deleter,应该使用shared_ptr直接构造。

构造函数

因为make_shared需要用到类的拷贝构造,因此需要被管理的类的构造函数是public的。

内存延迟归还

因为分配的空间是连续的,在资源指针的Uses变为0之后,控制块伴随资源的资源不会被立即释放,要等Weak也变为0,整块内存才被释放。资源只是被clear,但是但是没有归还操作系统。而如果是默认的控制块,在资源指针的Uses变为0之后,资源会被立即释放,内存立即归还。

通过调试看直接构造和make_shared的区别

void test2()
{std::shared_ptr<string> p1 = std::make_shared<std::string>(10, '9');{std::weak_ptr<std::string> wptr1;wptr1 = p1;std::shared_ptr<string> p2 = std::make_shared<std::string>("Hello");wptr1 = p2;p2 = p1;}std::cout << "end";
}void test1()
{std::shared_ptr<string> p1 = std::shared_ptr<std::string>(new std::string(10, '9'));{std::weak_ptr<std::string> wptr1;wptr1 = p1;std::shared_ptr<string> p2 = std::shared_ptr<std::string>(new std::string("Hello"));wptr1 = p2;p2 = p1;}std::cout << "end";
}int main()
{test1();test2();return 0;
}

直接构造在这里插入图片描述

当wptr指向p1的时候,可以看到p1的Weaks变为了2,weak_ptr观察到的内容与p1一致。并且注意此时control block的value显示为default,表示默认的控制块。
在这里插入图片描述
当weak_ptr指向p2,并且将p2指向p1,意思就是p2原来管理的Hello资源要释放掉,然后用p1拷贝构造一个对象,赋值给p2,让p1和p2同时管理10个9。
此时可以看到weak_ptr的资源指针已经显示Error reading,说明资源已经释放,内存已经归还了。

make_shared构造

在这里插入图片描述
此时可以看到原来为default的control block已经改为了make_shared。
在这里插入图片描述
重复之前的操作,把p2指向p1,再看weak_ptr的成员。可以看到ptr指向的资源并没有被释放,只是内容并清空而已。只有当weak_ptr的生命周期结束,整个内存块才会被释放,归还给操作系统。
这就是make_shared最主要的缺点,在某些内存要求高的场景下可能不太适用。

http://www.yidumall.com/news/50533.html

相关文章:

  • 兼职 网站建设深圳快速seo排名优化
  • 电子商务推广方式有哪些aso应用商店优化
  • 深圳市龙华区网站建设如何写软文推广产品
  • 网站招聘怎么做什么软件可以免费引流
  • 网站建设制作设计营销 大连今天特大新闻最新消息
  • 怎么做外贸企业网站国外网站排名前十
  • 做百度网站每年的费用多少安卓优化大师hd
  • wordpress站点地图优化搜索引擎有哪些网站
  • 四川网站设计推广软件有哪些
  • 免费的制作网站十堰seo
  • 做网站用的动漫资料公司网站与推广
  • 成都建设网站西安今天出大事
  • 北京今天出现什么情况了西安seo外包
  • 返利网站做淘宝怎么创建网页
  • 建展机械有限公司整站seo排名外包
  • 杭州网站建设优化案例凡科网免费建站
  • 网站制作优势百度指数数据下载
  • 商城开发建设seo排名优化首页
  • 网站制作的困难与解决方案seo研究中心培训机构
  • 石家庄网站seo优化山东服务好的seo公司
  • 网站改版升级通知如何制作网站链接
  • 网站开发预算报价表网络推广可做哪些方面
  • 如何自建公司网站网站推广优化流程
  • 动感网站模板网络营销策划书的主要内容
  • wordpress seo优化内江seo
  • 网上做网站网站seo诊断分析报告
  • 开发网站开源免费深圳网络seo推广
  • 交互做的比较好的网站长沙seo免费诊断
  • 国内装饰行业网站制作5g网络优化
  • 做网站要了解哪些浏览器老是出现站长工具