tmp 类(2)
tmp 类(2)
原作者:dingwklive (http://blog.sina.com.cn/dingwklive)位置: ..\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; // 报错!!
--------------------
水平有限,望指正
--------------------

浙公网安备 33010602011771号