欢迎来到天天文库
浏览记录
ID:48476178
大小:81.50 KB
页数:17页
时间:2020-02-04
《C++标准库智能指针.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、C++标准库智能指针(std::auto_ptr)智能指针两大特性:1.构造栈对象的生命期控制堆上构造的对象的生命期2.通过release来保证auto_ptr对对象的独权.另必须使用显示构造文章结构:一、剖析C++标准库智能指针(std::auto_ptr) 1.DoyouSmartPointer? 2.std::auto_ptr的设计原理 3.std::auto_ptr高级使用指南 4.你是否觉得std::auto_ptr还不够完美?-------------------------------------------------------
2、--------------一、剖析C++标准库智能指针(std::auto_ptr) 1.DoyouSmartPointer? SmartPointer,中文名:智能指针,舶来品? 不可否认,资源泄露(resourceleak)曾经是C++程序的一大噩梦.垃圾回收 机制(GarbageCollection)一时颇受注目.然而垃圾自动回收机制并不能 满足内存管理的即时性和可视性,往往使高傲的程序设计者感到不自在. 况且,C++实现没有引入这种机制.在探索中,C++程序员创造了锋利的 "SmartPoint
3、er".一定程度上,解决了资源泄露问题. 也许,经常的,你会写这样的代码: //x拟为class: // classx{ // public: // intm_Idata; // public: // x(intm_PARAMin):m_Idata(m_PARAMin){} // voidprint(){cout<4、ta<DoSomething(); //#2 deletem_PTRx; } 是的,这里可能没什么问题.可在复杂、N行、m_PTRclassobj所指对象生命周 期要求较长的情况下,你能保证你不会忘记deletem_PTRclassobj吗?生活中, 我们往往不应该有太多的口头保证,我们需要5、做些真正有用的东西.还有一个 更敏感的问题:异常.假如在#2方法执行期异常发生,函数执行终止,那么new 出的对象就会泄露.于是,你可能会说:那么就捕获异常来保证安全性好了. 你写这样的程式: voidfook(){ A*m_PTRx=newA(m_PARAMin); try{ m_PTRx->DoSomething(); } catch(..){ deletem_PTRx; throw; } deletem_PTRx; } 6、 哦!天哪!想象一下,你的系统,是否会象专为捕获异常而设计的. 一天,有人给你建议:"用SmartPointer,那很安全.".你可以这样重写你的程序: voidfook(){ auto_ptrm_SMPTRx(newx(m_PARAMin)); m_SMPTRx->DoSomething(); } OK!你不太相信.不用delete吗? 是的.不用整天提心吊胆的问自己:"我全部delete了吗?",而且比你的delete 策略更安全. 然后,还有人告诉你,可以这样用呢: 7、 ok1. auto_ptrm_SMPTR1(newx(m_PARAMin)); auto_ptrm_SMPTR2(m_SMPTR1); //#2 Maybeyoucancode#2likethis: auto_ptrm_SMPTR2; m_SMPTR2=m_SMPTR1; ok2. auto_ptrm_SMPTR1(newint(32)); ok3. auto_ptrm_SMPTR1; m_SMPTR1=8、auto_ptr
4、ta<DoSomething(); //#2 deletem_PTRx; } 是的,这里可能没什么问题.可在复杂、N行、m_PTRclassobj所指对象生命周 期要求较长的情况下,你能保证你不会忘记deletem_PTRclassobj吗?生活中, 我们往往不应该有太多的口头保证,我们需要
5、做些真正有用的东西.还有一个 更敏感的问题:异常.假如在#2方法执行期异常发生,函数执行终止,那么new 出的对象就会泄露.于是,你可能会说:那么就捕获异常来保证安全性好了. 你写这样的程式: voidfook(){ A*m_PTRx=newA(m_PARAMin); try{ m_PTRx->DoSomething(); } catch(..){ deletem_PTRx; throw; } deletem_PTRx; }
6、 哦!天哪!想象一下,你的系统,是否会象专为捕获异常而设计的. 一天,有人给你建议:"用SmartPointer,那很安全.".你可以这样重写你的程序: voidfook(){ auto_ptrm_SMPTRx(newx(m_PARAMin)); m_SMPTRx->DoSomething(); } OK!你不太相信.不用delete吗? 是的.不用整天提心吊胆的问自己:"我全部delete了吗?",而且比你的delete 策略更安全. 然后,还有人告诉你,可以这样用呢:
7、 ok1. auto_ptrm_SMPTR1(newx(m_PARAMin)); auto_ptrm_SMPTR2(m_SMPTR1); //#2 Maybeyoucancode#2likethis: auto_ptrm_SMPTR2; m_SMPTR2=m_SMPTR1; ok2. auto_ptrm_SMPTR1(newint(32)); ok3. auto_ptrm_SMPTR1; m_SMPTR1=
8、auto_ptr
此文档下载收益归作者所有