天天看点

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

继续阅读