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的时候会发生未定义行为。

posted @ 2017-08-28 21:39  五月份小姐  阅读(247)  评论(0编辑  收藏  举报