博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

sislcb

寻找自己
sislcb.cublog.cn
剖析C++标准库智能指针(std::auto_ptr) (1)
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 x(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(100);
      auto_ptr
<x> m_SMPTR = m_pTR;
      


      no6..........and so on

      预先提及所有权的问题,以便下面带着疑问剖析代码?

 

      power1.
      auto_ptr
<x> m_SMPTR1(new x(100));
      auto_ptr
<x> m_SMPTR2 = m_SMPTR1;
      m_SMPTR2
->print();
      
//输出:100.
      m_SMPTR1->print();
      
//!! 非法的.

      power2.
      auto_ptr
<x> m_SMPTR(new x(100));
      
      auto_ptr
<x> returnfun(auto_ptr<x> m_SMPTRin){
      
return m_SMPTRin;
      }

      
      auto_ptr
<x> = returnfun(m_SMPTR);  //#5

 

      //在上面的#5中,我要告诉你对象所有权转移了两次.
      //什么叫对象所有权呢?
  

 原文地址 http://www.cppblog.com/yuanyajie/archive/2006/12/15/16489.html
发表于: 2007-10-25,修改于: 2007-10-25 11:41,已浏览526次,有评论0条 推荐 投诉

给我留言
版权所有 ChinaUnix.net 页面生成时间:4.07651