};
顾名思义,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-&
|