快速业务通道

Java语言灵巧指针与垃圾回收 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
};

顾名思义,CPtrManager 就是用来管理指针的,对于我们用new 分配的每一个指针,都存放在m_ptr[index]中,并在m_count[index]中存放它的引用记数。同时,我们对每一个指针都增加了一个标志(mark >0,<=0为无效),这个标志同时存在于灵巧指针中(后面将看到),这是为了一种双重保险,并且在这里,这个标志就等于指针在m_ptr中的索引,这也为快速查找提供了方便。

总的思路是这样的:当我们用new分配一个指针时,这个指针将被存入CPtrManager中,当一个灵巧指针开始拥有这个指针时,CPtrManager将负责对这个指针的引用记数加 1 ,反之亦然,即一个灵巧指针开始释放该指针的拥有权时,CPtrManager将负责对这个指针的引用记数减 1 ,如果引用记数为 0 ,那么这个灵巧指针将负责对该指针 delete。

Java语言灵巧指针与垃圾回收(3)

时间:2011-01-16

下面是灵巧指针的部分介绍:

template class auto_ptr { public: auto_ptr() {mark=0;pointee=0;} auto_ptr(auto_ptr&rhs); auto_ptr(T*ptr); ~auto_ptr(){Remove();} T*operator->() const; operator T*(); T&operator*()const; auto_ptr&operator=(auto_ptr&rhs); auto_ptr&operator=(T*ptr); private: void Remove(); file://释放所指指针的拥有权 T*pointee; file://所拥有的指针 int mark;//所拥有的指针的标志 }; template void auto_ptr< T>::Remove() { CPtrManager * pMana=CPtrManager::GetPtrManager(); if(pointee&&pMana) { if(pMana->Release(mark,pointee))  file://减少引用记数 { if(pMana->GetCount(mark,pointee) ==0) delete pointee;  file://如果引用记数为0,delete 指针 }    else file://所拥有的指针不在CPtrManager 中,有可能在栈中 { file://User decide to do } } pointee=NULL; file://复位 mark=0; } template auto_ptr< T>::auto_ptr(auto_ptr&rhs) { pointee=rhs.pointee; mark=rhs.mark; CPtrManager * pMana=CPtrManager::GetPtrManager(); if(pMana) pMana->AddCount(mark,pointee); file://增加引用记数 } template auto_ptr< T>::auto_ptr(T*ptr) { mark=0; pointee=ptr; CPtrManager * pMana=CPtrManager::GetPtrManager(); if(pMana) { mark=pMana->GetMarkFromPtr(ptr); file://得到指针的标志 if(mark>0) pMana->AddCount(mark,pointee); file://如果标志不为0,增加引用记数 } } templateauto_ptr& auto_ptr< T>::operator=(auto_ptr&rhs) { if(pointee!=rhs.pointee) { Remove(); file://释放当前指针的拥有权 pointee=rhs.pointee; mark=rhs.mark; CPtrManager * pMana=CPtrManager::GetPtrManager(); if(pMana) pMana->AddCount(mark,pointee); } return *this; } template auto_ptr&auto_ptr< T>::operator = (T* ptr) { if(pointee!=ptr) { Remove(); pointee=ptr; CPtrManager * pMana=CPtrManager::GetPtrManager(); if(pMana) { mark=pMana->GetMarkFromPtr(ptr); if(mark>0) pMana->AddCount(mark,pointee); } } }

Java语言灵巧指针与垃圾回收(4)

时间:2011-01-16

当到了这里时,我便以为大功告成,忍不住摸拳搽掌,很想试一试。结果发现对于一般的情况,效果确实不错,达到了垃圾回收的效果。如下面的应用:

auto_ptr p1=new test; auto_ptrp2 = p1; auto_ptrp3 = new test;

但是,很快地,我在测试前面提到的回环时,就发现了问题,我是这样测试的:

class test { auto_ptr p; }; auto_ptr p1=new test; auto_ptrp2 =new test; p1->p=p2; p2-&

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号