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

豆豆网   技术应用频道   2007年10月29日    社区交流

内容摘要:一些C++ 书上经常告诫程序员:要养成好的习惯,new 与 delete 要成对出现,时刻记住将内存释放回系统。但是,事情只是这么简单吗?

   这里又引入了两个类:CMark 和 CMarkTable ,这是为了在处理互锁问题之前,对 CPtrManager 中的 CPtr 进行快速拷贝,以防止影响其它线程的正常运行。其实,这里的 CMark 与 CPtr 没有什么区别,它只是简单地从 CPtr 中拷贝信息,也就是说,它等同于 CPtr 。

   为了处理互锁问题,先要把可能被互锁的内存指针找出来,看下面函数的实现:

void CMarkTable::GetLockMark()
{
CLockMarkArray.SetSize(0);
int size=CMarkArray.GetSize();
for(int i=0;i{
 CMark * theMark=(CMark*)CMarkArray[i];
 if(theMark)
 {
  if(theMark->bIsNoneInStack())
   CLockMarkArray.SetAtGrow(i,theMark);
 }
}
}

   把这些内存找出来之后,就需要把那些假锁的内存找出来,什么是假锁呢?看下面的例子:

   对于指针 ptrA ,如果它的灵巧指针 autoA 存在于指针 ptrB 中,而 ptrB 的灵巧指针 autoB 又存在于 ptrA 中,那么 ptrA 和 ptrB 是真锁,但是如果ptrB 的灵巧指针 autoB 存在于指针 ptrC 中,而 ptrC的灵巧指针 autoC 存在于栈中,那么, ptrA 和 ptrB 属于假锁。怎么找出假锁的内存呢?看下面函数的实现:

void CMarkTable::RemoveUnlockMark()
{
CUIntArray UnlockMarkArray;
BOOL bNoneRemoveed;
do
{
bNoneRemoveed=TRUE;
UnlockMarkArray.SetSize(0);
int size=CLockMarkArray.GetSize();
for(int i=0;i{
  CMark * theMark=(CMark*)CLockMarkArray[i];
  if(theMark)
  {
    int size1=(theMark->automarkArray).GetSize();
         for(int j=0;j    {
     int mark=(theMark->automarkArray)[j];
     if(!FindLockMark(mark)) file://判断灵巧指针是否存在于CLockMarkArray所包含的指针中
     {
 UnlockMarkArray.InsertAt(0,i); file://record to remove
 bNoneRemoveed=FALSE;
 break;
     }
    }
   }
  else
  {     UnlockMarkArray.InsertAt(0,i);
    bNoneRemoveed=FALSE;
   }
}
int size2=UnlockMarkArray.GetSize();
for(int k=0;k{
  int m=UnlockMarkArray[k];
  CLockMarkArray.RemoveAt(m);
}
}while(!bNoneRemoveed);
  
}

责编:豆豆技术应用

正在加载评论...