C++primer 12.1.3节练习

练习12.10

此调用是正确的,利用p创建一个临时的shared_ptr赋予了process的参数ptr,p和ptr都指向相同的int对象,引用计数被正确地置为2。process执行完毕后,ptr被销毁,引用计数减1,这是正确的——只有p指向它。

练习12.11

此调用是错误的,这里使用get获得一个内置指针,再用内置指针初始化一个临时的智能指针,临时的智能指针在函数结束后内存被释放,此时p变成空悬指针,使用p时将发生未定义行为。

网上答案:此调用是错误的。p.get()获得一个普通指针,指向p所共享的int对象。利用此指针创建一个shared_ptr,而不是利用p创建一个shared_ptr,将不会形成正确的动态对象共享。编译器会认为p和ptr是使用两个地址(虽然他们相等)创建的两个不相干的shared_ptr,而非共享同一个动态对象。这样,两者的引用计数均为1。当process执行完毕后,ptr的引用计数减为0,所管理的内存地址被释放,而此内存就是p所管理的。p成为一个管理空悬指针的shared_ptr。

练习12.12

a)合法,sp是一个智能指针,引用计数为1,赋给形参,引用计数为2,结束后引用计数递减为1,合法。

b)不合法,无法将一个int*类型转换为share_ptr<int>,接受指针参数的智能指针构造函数无法进行隐式转换,只能进行直接初始化

c)不合法,无法将一个int*类型转换为share_ptr<int>

d)合法,效果和第一个类似,但是其内存会被释放。

练习12.13

p的内存被释放,所以接下来试图使用sp的时候会发生未定义行为。

转载于:https://www.cnblogs.com/wuyinfenghappy/p/7445922.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值