自学内容网 自学内容网

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 类似。


原文地址:https://blog.csdn.net/zhyjhacker/article/details/140538871

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!