第十二章 12.1.3节练习

练习12.10

下面的代码调用了第413页中定义的process函数,解释此函数调用是否正确。如果不正确,应如何修改?

shared_ptr<int> p(new int(42));
process(shared_ptr<int>(p));

解答:

这里和413页的结果是一样的,在process运行过程中,引用数值至少为2。

当process结束时,ptr的引用计数会递减,但不会变为0。

因此,当局部变量ptr被销毁时,ptr指向的内存不会被释放。

这里除了将process的参数改成引用,还要将

process(shared_ptr<int>(p));

还原为

process(p);
这样就能保证在process运行时,引用数值为1了。


练习12.11

如果我们想下面这样调用process,会发生什么?

process(shared_ptr<int>(p.get()));
解答:

这里的情况和413页,process(shared_ptr<int>(x))应该是一致的。

因为get()返回的就是智能指针保存的一般指针。


练习12.12

p和q的定义如下,对于接下来对process的每个调用,如果合法,解释它做了什么,如果不合法,解释错误原因:

auto p = new int();
auto sp = make_shared<int>();
(a) process(sp);
(b) process(new int());
(c) process(p);
(d) process(shared_ptr<int>(p));
解答:

(a) 合法的,对于sp进行了初始化,process可以对其进行使用。

(b) 非法的,不能将*int转换为一个shared_ptr<int>指针

(c) 非法的,同 (b)

(d) 合法的,但当函数结束时,内存会被释放。


练习12.13

如果执行下面的代码,会发生什么?

auto sp = make_shared<int>();
auto p = sp.get();
delete p;
解答:

应该会发生二次销毁的错误。这里由get()得到的指针,不应由delete去删除。


当智能指针对象被销毁时,这段内存也会随之释放。

挡在这里使用delete进行显式释放,则会出现二次销毁。






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值