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

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

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

   上面的应用中加入了灵巧指针的标志,其实,这个标志就等于该灵巧指针所存在的内存的指针的标志。例如:我们用 new 分配了一个 test 指针,假如这个指针的标志 mark=1,那么,这个 test 中的灵巧指针 auto_ptr p 的标志 automark=1。如果一个灵巧指针存在于栈中,那么它的 automark=0。反之亦然,如果一个灵巧指针的 automark 等于一个指针的 mark,那么,该灵巧指针必存在于这个指针所指的内存中。可是,如何得到这个标志呢,请看下面这个函数的实现:

int CPtrManager::GetAutoMark(void *ptr)
{
  CSingleLock singleLock(&mutex);
  singleLock.Lock(); file://线程同步
  
 int size =m_ptr.GetSize();
 for(int i=1;i {
   CPtr* theCPtr=(CPtr*)m_ptr[i];
   if(theCPtr)
   {
  int ptrFirst=(int)theCPtr->GetPtr();//得到内存的首指针
  int ptrEnd=ptrFirst+theCPtr->GetPtrSize();//得到内存的尾指针
  int p=(int)ptr; file://灵巧指针的指针
  if(p>=ptrFirst&&p<=ptrEnd)//比较灵巧指针的指针是否在首尾之间
          return i;
   }
 }
 return 0;
}

  这个函数的原理就在于:如果一个灵巧指针存在于一块内存中,那么该灵巧指针的指针必在这块内存的首尾指针之间。

  解决了灵巧指针的位置问题,下一步就是要找出所有被互锁的内存的指针。这个好实现,只要所有拥有这个指针的灵巧指针的 automark > 0 ,那么,这块内存就可能被互锁了(注意只是可能),接着看下面的实现:

class CMark
{
friend class CMarkTable;
public:
CMark(){}
virtual ~CMark(){}
  
  void operator delete(void * p)
{
  free(p);
}
  void * operator new(size_t size)
{ 
      return malloc(size);
}
void CopyFromCPtr(CPtr* theCPtr); file://从 CPtr 中拷贝相关信息
BOOL bIsNoneInStack(); file://判断拥有该指针的所有灵巧指针是否都不在栈中
void Release(); file://解除该指针的互锁
private:
int m_mark; file://指针的标志
CPtrArray autoptrArray; file://拥有该指针的所有灵巧指针的指针数组
CUIntArray automarkArray;//拥有该指针的所有灵巧指针的标志
  
};
class CMarkTable
{
public:
CMarkTable(){Init();}
virtual ~CMarkTable(){}
void AddCMark(CMark * theCMark);
BOOL FindMark(int mark);
void Init();
void DoLockMark(); file://处理互锁问题
private:
CPtrArray CMarkArray; file://暂存从CPtrManager 中拷贝过来的指针信息的 CMark 指针数组
CPtrArray CLockMarkArray; file://存放互锁的内存
void GetLockMark(); file://得到所有可能被互锁的内存的 CMark,结果存放于CLockMarkArray
BOOL FindLockMark(int mark); file://判断一个灵巧指针是否存在于CLockMarkArray所包含的指针中
void RemoveUnlockMark();//去除假的互锁内存
void RemoveGroup(int automark);//对互相有联系的相互死锁的内存进行分组
  
};

责编:豆豆技术应用

正在加载评论...