网站大量收购闲置独家精品文档,联系QQ:2885784924

C++auto_ptr浅析.docxVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Cauto_ptr浅析

auto_ptr是C++标准库中(utility)为了解决资源泄漏的问题提供的一个智能指针类模板(注意:这只是一种简单的智能指针)auto_ptr的实现原理其实就是RAII,在构造的时候获取资源,在析构的时候释放资源,并进行相关指针操作的重载,使用起来就像普通的指针。std::auto_ptrClassA pa(new ClassA);下面主要分析一下auto_ptr的几个要注意的地方:1,Transfer of Ownershipauto_ptr与boost库中的share_ptr不同的,auto_ptr没有考虑引用计数,因此一个对象只能由一个auto_ptr所拥有,在给其他auto_ptr赋值的时候,会转移这种拥有关系。??123456789101112131415161718192021222324252627282930313233343536373839404142#include utility#include iostreamusing?namespace?std;?class?A{public:????A() { id = ++count; cout create A? id? ? \n; }????~A() { cout destroy A? id \n; }private:????static?int?count;????int?id;};?int?A::count = 0;?/*调用该函数会丢失掉所有权*/void?sink(auto_ptrA a){????cout Enter sink()\n;}?/*调用该函数会创建对象,并获取所有权*/auto_ptrA create(){????cout Enter create()\n;????auto_ptrA a(new?A());????return?a;}?int?main(int?argc, char?*argv[]){????auto_ptrA a1 = create();????auto_ptrA a2 = a1; /*转移所有权,此时a1无效了*/????auto_ptrA a3(new?A());????cout Exit create()\n;????sink(a2);/*丢失所有权,会发现a2的释放在sink函数中进行*/????cout Exit sink()\n;????return?0;}?输出结果是:brEnter create()brcreate A1brcreate A2brExit create()brEnter sink()brdestroy A1brExit sink()brdestroy A2brbr2,从上可知由于在赋值,参数传递的时候会转移所有权,因此不要轻易进行此类操作。?? 比如:std::auto_ptrClassA pa(new ClassA());?? bad_print(pa); //丢失了所有权?? pa-...; //Error3,使用auto_ptr作为成员变量,以避免资源泄漏。?? 为了防止资源泄漏,我们通常在构造函数中申请,析构函数中释放,但是只有构造函数调用成功,析构函数才会被调用,换句话说,如果在构造函数中产生了异常,那么析构函数将不会调用,这样就会造成资源泄漏的隐患。?? 比如,如果该类有2个成员变量,指向两个资源,在构造函数中申请资源A成功,但申请资源B失败,则构造函数失败,那么析构函数不会被调用,那么资源A则泄漏。? 为了解决这个问题,我们可以利用auto_ptr取代普通指针作为成员变量,这样首先调用成功的成员变量的构造函数肯定会调用其析构函数,那么就可以避免资源泄漏问题。4,不要误用auto_ptr? 1)auto_ptr不能共享所有权,即不要让两个auto_ptr指向同一个对象。? 2)auto_ptr不能指向数组,因为auto_ptr在析构的时候只是调用delete,而数组应该要调用delete[]。? 3)auto_ptr只是一种简单的智能指针,如有特殊需求,需要使用其他智能指针,比如share_ptr。? 4)auto_ptr不能作为容器对象,STL容器中的元素经常要支持拷贝,赋值等操作,在这过程中auto_ptr会传递所有权,那么source与sink元素之间就不等价了。auto_ptr解析By SmartPtr(/SmartPtr/)auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智能指针, 或许相对于Loki中那个无所不包的智能指针,这个不怎么智能的智能指针难免会黯然失色。诚然,auto_ptr有这样那样的不如人意,以至于程序员必须像使用”裸“指针那样非常小心的使用它才能保证不出错,以至于它甚至无法适用

文档评论(0)

2017ll + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档