内容摘要:一些C++ 书上经常告诫程序员:要养成好的习惯,new 与 delete 要成对出现,时刻记住将内存释放回系统。但是,事情只是这么简单吗?
class CPtr
{
friend class CMark;
public:
int GetPtrSize(); file://得到用 new 分配指针的内存的大小
CMutex * GetCMutex(); file://用于线程同步
void * GetPtr(); file://得到用 new 分配的指针
CPtr();
virtual ~CPtr();
int GetCount(); file://得到引用记数
void AddAutoPtr(void * autoPtr,int AutoMark);//加入一个拥有该指针的灵巧指针
BOOL DeleteAutoPtr(void * autoPtr); file://释放一个灵巧指针的拥有权
void SetPtr(void * thePtr,int Size, int mark,int count=0); file://设置一个新的指针
void operator delete(void * p)
{
free(p);
}
void * operator new(size_t size)
{
return malloc(size);
}
private:
int m_mark; file://指针标志
int m_count; file://引用记数
void * m_ptr; file://分配的指针
int m_size; file://指针指向内存的大小
CPtrArray AutoPtrArray; file://存放拥有该指针的所有灵巧指针的指针数组
CUIntArray m_AutoMark; file://灵巧指针标志:0 in the stack; >0 =mark
CMutex mutex; file://用于线程同步
};
class CPtrManager
{
public:
int GetAutoMark(void * ptr); file://通过灵巧指针的指针,得到灵巧指针标志
CPtrManager();
virtual ~CPtrManager();
int GetMarkFromPtr(void * Ptr);
void *MallocPtr(size_t size);
BOOL bCanWrite();
void DeletePtr(int mark,void * Ptr);
void AddPtr(void *Ptr,int PtrSize);
static CPtrManager * GetPtrManager();
CPtr * GetCPtr(void * Ptr,int mark);//通过指针和指针标志得到存放该指针的 CPtr
private:
CPtrArray m_ptr; file://存放 CPtr 的指针数组
void* pCurrent;
unsigned int m_mark;
CUIntArray m_removed;
BOOL bWrite; file://在解决互锁现象的过程中,谢绝其它线程的处理
static CPtrManager * p_this;
CMutex mutex;//用于线程同步
CMarkTable myMarkTable;
void RemoveLockRes(); file://处理互锁内存
void CopyAllMark(); file://处理互锁现象前,先对所有的CPtr进行拷贝
static UINT myThreadProc(LPVOID lparm); file://处理互锁现象的线程函数
CWinThread* myThread;
void BeginThread()
{ myThread=AfxBeginThread(myThreadProc,this,THREAD_PRIORITY_ABOVE_NORMAL);}
};
责编:豆豆技术应用