C++临时对象和智能指针做参数传递的强引用计数变化

shared_ptr<int> myfunc(shared_ptr<int> &ptmp) {
 return ptmp;//ptmp = shared_ptr 100 [3 strong refs] [make_shared]如果没有用引用,是显示3个强引用计数
 //ptmp = shared_ptr 100 [2 strong refs] [make_shared]如果用了引用,是2个计数,不会增加,如果值传递会创建临时对象
}

在这里插入图片描述

auto p1 = make_shared<int>(100);//返回一个智能指针
auto p2 = (p1);p1 p2都指向了相同的内存,此内存有两个引用者
//myfunc(p2);//返回之后p2 = shared_ptr 100 [2 strong refs] [make_shared]
/返回之后的强引用计数变为2

auto p3 = myfunc(p2);//如果用auto p3变量来接收myfunc(p2)返回值
//p3 = shared_ptr 100 [3 strong refs] [make_shared]一样可以产生计数

p3 = make_shared<int>();//重新定义之后,p3为计数1了,p2和p1又回到2个强引用计数中了


性能分析:make_shared();在没有用到自定义删除器时,优先使用。
shared_ptr (new int(111));
会创建两次,在New int时,生成一个裸指针额,在shared_ptr时,生成智能指针。
shared_ptr智能指针内部会有指向该对象内存的指针,也会有一个指向其控制块的智能指针。包含了,自定义的删除器,内存分配器等。
智能指针是8字节,是裸指针的两倍。
最后:永远不要用get得到的指针来初始化另外一个智能指针,或者给另外一个智能指针赋值。会造成不可预料的后果。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值