练习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进行显式释放,则会出现二次销毁。