c++ primer plus 第16章string 类和标准模板库, 16.2.4 选择智能指针

c++ primer plus 第16章string 类和标准模板库, 16.2.4 选择智能指针

c++ primer plus 第16章string 类和标准模板库, 16.2.4 选择智能指针


16.2.4 选择智能指针

应使用哪种智能指针呢?如果程序要使用多个指向同一个对象的指针,应选择shared ptr。这样的情况包括:有一个指针数组,并使用一些辅助指针来标识特定的元素,如最大的元素和最小的元素;两个对象包含都指向第三个对象的指针;STL容器包含指针。很多STL算法都支持复制和赋值操作,这些操作可用于 shared ptr,但不能用于 unique ptr(编译器发出警告)和 auto ptr(行为不确定)。如果您的编译器没有提供 shared ptr,可使用 Boost 库提供的 shared ptr。
如果程序不需要多个指向同一个对象的指针,则可使用uniqueptr。如果函数使用new 分配内存,并
返回指向该内存的指针,将其返回类型声明为uniqueptr 是不错的选择。这样,所有权将转让给接受返回值的 unique pt,而该智能指针将负责调用 delete。可将unique ptr 存储到 STL容器中,只要不调用将一个unique ptr 复制或赋给另一个的方法或算法(如 sort())。例如,可在程序中使用类似于下面的代码段,这里假设程序包含正确的 include 和 using 语句:

unique_ptr<int>make int(int n)
{
return unique ptr<int>(new int(n));
}

void show(unique ptr<int>& pi)// pass by reference
{
Cout <<*a<<'';
}

int main()
{
...
vector<unique ptr<int>>vp(size);
for(int i=0;i<vp.size(); i++)
vp[i]=make int(rand()%1000);// copy temporary unique ptr
vp.push back(make int(rand()%1000))//ok because arg is temporary
for each(vp.begin(),vp.end(),show);// use for each()


...
}

其中的 push back()调用没有问题,因为它返回一个临时unique ptr,该 unique ptr 被赋给 vp 中的一个unique ptr。另外,如果按值而不是按引用给show()传递对象,foreach()语句将非法,因为这将导致使用一个来自 vp的非临时 unique pt 初始化 pì,而这是不允许的。前面说过,编译器将发现错误使用 unique pt的企图。
在 umique ptr 为右值时,可将其赋给 shared ptr,这与将一个unique ptr 赋给另一个需要满足的条件相同。与前面一样,在下面的代码中,make int()的返回类型为unique ptr:

unique ptr<int>pup(make int(rand()%1000);//ok
shared ptr<int>spp(pup);// not allowed,pup an lvalue
shared ptr<int>spr(make int(rand()1000);//ok

模板 shared ptr 包含一个显式构造函数,可用于将右值unigue ptr 转换为 shared ptr。shared ptr 将接管原来归 unique ptr 所有的对象。
在满足 unique ptr 要求的条件时,也可使用 auto ptr,但unique ptr是更好的选择。如果您的编译器没有提供 unique ptr,可考虑使用 BOOST库提供的 scoped ptr,它与 unique ptr 类似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值