tmp 类(2)

tmp 类(2)

原作者:dingwklive  (http://blog.sina.com.cn/dingwklive)
原文地址:http://blog.sina.com.cn/s/blog_9a46351401017rbl.html
 
 

位置: ..\src\openFOAM\memory\tmp\

写过tmp类,但是实际一直没弄清楚。又仔细看了遍代码,做点补充。

 

tmp类的对象行为实际上分为两种:常量引用和动态指针,两种情况tmp对象的行为不同。
     常量引用时,将tmp当做一个普通变量处理;
     动态指针时,类似autoPtr但是采用引用计数方式管理内存,指针可以有传递(计数不变)和复制(计数+1)两种方式。
     因此,操作tmp对象前必须明确tmp对象属于哪一种,以下讨论中涉及tmp对象时都要先进行判断。

 

判断:
tmp::isTmp();  // =true 为指针,=false 为引用
tmp::empty();  // 为指针且指针为空(ptr_=null)时为 true
tmp::valid();  // 表示有数据:为引用 或者 为非空指针


构造:
tmp tp1();                  //tp1为指针,储存一个空指针 tp1.ptr_= null;tp1.ref_ = *(null)
                            //(注意T必须为null指针提供所指内容)
       
tmp tp1(T*);                //tp1为指针,储存指针;
tmp tp1(const T&);          //tp1为引用,复制内容;
tmp tp1(const tmp& tp2);    //tp2为引用:tp1为引用,复制内容
                            //tp2为指针:tp1为指针,复制指针(引用计数+1)
       
tmp tp1(const tmp& tp2, bool allowTransfer);
                               //tp2为引用:tp1为引用,复制内容
                               //tp2为指针:tp1为指针,allowTransfer = true  复制指针(引用计数+1)
                               //                      allowTransfer = false 传递指针(tp2为空指针)
析构:
tmp::~tmp(); // 为引用时无操作;

             // 为指针时ptr_=null,引用计数-1,当引用计数减为0时,释放内存delete ptr_;


操作:
T* tmp::ptr();// 提取指针:

               // tmp为指针时返回指针,自身指针为空ptr_= null;
               // tmp为引用时返回所存引用的地址(const_cast(ref_),有不确定性,参见代码注释)
    

T* tmp::clear() //释放指针:

                   //tmp为引用时, 无操作;
                   //tmp为指针时,不判断引用计数,直接释放内存delete ptr_,这与析构操作不同
                   //(不太明白为什么这样设计,跳过引用计数判断,感觉不安全啊, 用的时候小心吧)
访问引用:     
tmp::operator()();//tp为指针,等于储存指针所指对象的引用;tp为引用,等于储存的引用;

 

访问指针:
tmp::operator->(); // tp为指针, 等于储存的指针;

                   // tp为引用,等于储存的引用的指针(const_cast(ref_))

其他操作:
T tt;
tmp tp1, tp2;

tp1 = tp2;   // 仅允复制指针操作: tp2为引用时,报错!
             //                    tp2为指针时,复制指针给tp1,引用计数+1,操作完后tp1为指针

 
tp1 = tt;   // tp1变为引用,存储tt;
tp1 = *tt;  // 报错!!

 

      
     

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

水平有限,望指正
--------------------

posted @ 2020-12-25 11:34  Lagomgom  阅读(165)  评论(0)    收藏  举报