C++深度探索系列:智能指针(Smart Pointer) [一]

主题索引:

一、剖析C++标准库智能指针(std::auto_ptr)
   
    1.Do you Smart Pointer?
    2.std::auto_ptr的设计原理
    3.std::auto_ptr高级使用指南
    4.你是否觉得std::auto_ptr还不够完美?

二、C++条件,寻找构造更强大的智能指针(Smart Pointer)的
    策略
   
    1.支持引用记数的多种设计策略
    2.支持处理多种资源
    3.支持Subclassing
    4.支持多线程条件下,线程安全的多种设计策略
    5.其它多种特殊要求下,再构造

三、Generic Programming基础技术和Smart Pointer
    1.回首处理资源中的Traits技术
    2.回首多线程支持的设计


四、COM实现中,Smart Pointer设计原理


五、著名C++库(标准和非标准)中的Smart Pointer现状

---------------------------------------------------------------------


一、剖析C++标准库智能指针(std::auto_ptr)
   
    1.Do you Smart Pointer?

      Smart Pointer,中文名:智能指针, 舶来品?
      不可否认,资源泄露(resource leak)曾经是C++程序的一大噩梦.垃圾回收
      机制(Garbage Collection)一时颇受注目.然而垃圾自动回收机制并不能
      满足内存管理的即时性和可视性,往往使高傲的程序设计者感到不自在.
      况且,C++实现没有引入这种机制.在探索中,C++程序员创造了锋利的
      "Smart Pointer".一定程度上,解决了资源泄露问题.

      也许,经常的,你会写这样的代码:
      //x拟为class:
      //            class x{
      //            public:       
      //                   int m_Idata;
      //            public:
      //                   x(int m_PARAMin):m_Idata(m_PARAMin){}
      //                   void print(){ cout<<m_Idata<<endl; }
      //            .....
      //            }
      //
      void fook(){
      x* m_PTRx = new A(m_PARAMin);
      m_PTRx->DoSomething();     //#2
      delete m_PTRx;
      }

      是的,这里可能没什么问题.可在复杂、N行、m_PTRclassobj所指对象生命周
      期要求较长的情况下,你能保证你不会忘记delete m_PTRclassobj吗?生活中,
      我们往往不应该有太多的口头保证,我们需要做些真正有用的东西.还有一个
      更敏感的问题:异常.假如在#2方法执行期异常发生,函数执行终止,那么new
      出的对象就会泄露.于是,你可能会说:那么就捕获异常来保证安全性好了.
      你写这样的程式:

      void fook(){
      A* m_PTRx = new A(m_PARAMin);
      try{
          m_PTRx->DoSomething();
      }
      catch(..){
          delete m_PTRx;
          throw;
      }
      delete m_PTRx;
      }
      哦!天哪!想象一下,你的系统,是否会象专为捕获异常而设计的.

      一天,有人给你建议:"用Smart Pointer,那很安全.".你可以这样重写你的程序:
   
      void fook(){
      auto_ptr<x> m_SMPTRx(new x(m_PARAMin));
      m_SMPTRx->DoSomething();
      }

      OK!你不太相信.不用delete吗?
      是的.不用整天提心吊胆的问自己:"我全部delete了吗?",而且比你的delete
      策略更安全.

      然后,还有人告诉你,可以这样用呢:
      ok1.
      auto_ptr<x> m_SMPTR1(new x(m_PARAMin));
      auto_ptr<x> m_SMPTR2(m_SMPTR1);  //#2
      May be you can code #2 like this :
          auto_ptr<x> m_SMPTR2;
          m_SMPTR2 = m_SMPTR1;     
      ok2.
      auto_ptr<int> m_SMPTR1(new int(32));
     
      ok3.
      auto_ptr<int> m_SMPTR1;
      m_SMPTR1 = auto_ptr<int>(new int(100));
      也可以:
      auto_ptr<int> m_SMPTR1(auto_ptr<int>(new int(100)));
     
      ok4.
      auto_ptr<x> m_SMPTR1(new x(m_PARAMin));
      m_SMPTR1.reset(new x(m_PARAMin1));
     
      ok5.
      auto_ptr<x> m_SMPTR1(new x(m_PARAMin));
      auto_ptr<x> m_SMPTR2(m_SMPTR.release());
      cout<<(*m_SMPTR2).m_Idata<<endl; 
     
      ok6.
      auto_ptr<int> fook(){
      return auto<int>(new int(100));
      }
 
      ok7.............and so on
     
      但不可这样用:
     
      no1.  
      char* chrarray = new char[100];
      strcpy(chrarray,"I am programming.");
      auto_ptr<char*> m_SMPTRchrptr(chrarray);
      //auto_ptr并不可帮你管理数组资源    
      
      no2.
      vector<auto_ptr<x>> m_VECsmptr;
      m_VECsmptr.push_back(auto_ptr<int>(new int(100)));
      //auto_ptr并不适合STL内容.
      
      no3.
      const auto_ptr<x> m_SMPTR1(new x(100));
      auto_ptr<x> m_SMPTR(new x(200));
     
      no4.
      x m_OBJx(300);
      auto_ptr<x> m_SMPTR(&m_OBJx);
     
      no5
      x* m_PTR = new x(

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值