一个类似于Java的GC功能的指针.(二)
由于MSDN说不能连续回复超过三次,所以另开一个 :)
//GarbageCollect.h文件(第四部分)
template <typename _C>
bool operator == (const int _X, const _GC_Y<_C>& _T)
{
return _T == _X;
}
template <typename _C>
bool operator != (const int _X, const _GC_Y<_C>& _T)
{
return _T != _X;
}
template <typename _C>
class _GC_Z
{
public:
_GC_Z()
{
m_pBaseClass = NULL;
}
~_GC_Z()
{
delete m_pBaseClass;
}
_GC_Y<_C>& operator()(_C* pBuf)
{
#ifdef _DEBUG
m_pBaseClass = new _GC_Y<_C>(pBuf);
_GC_ASSERT(NULL != m_pBaseClass);
return *m_pBaseClass;
#else
//这个地方在Release版本中内存分配失败时存在问题(不过发生几率很小,约为%0.01)
return *(m_pBaseClass = new _GC_Y<_C>(pBuf));
#endif
}
_GC_Y<_C>& operator [] (unsigned int uiSize)
{
#ifdef _DEBUG
m_pBaseClass = new _GC_Y<_C>(uiSize);
_GC_ASSERT(NULL != m_pBaseClass);
return *m_pBaseClass;
#else
//这个地方在Release版本中内存分配失败时存在问题(不过发生几率很小,约为%0.01)
return *(m_pBaseClass = new _GC_Y<_C>(uiSize));
#endif
}
private:
_GC_Y<_C>* m_pBaseClass;
};
#pragma warning(default: 4284)
#define _GC_NEW
#define GC_NEW _GC_NEW
#define GC_POBJECT(_X) _GC_Y<_X>
#define GC_PBOOL _GC_Y<bool>
#define GC_LPBOOL _GC_Y<bool>
#define GC_PSTR _GC_Y<char>
#define GC_LPSTR _GC_Y<char>
#define GC_PSZ _GC_Y<char>
#define GC_PCHAR _GC_Y<char>
#define GC_PUCHAR _GC_Y<unsigned char>
#define GC_PBYTE _GC_Y<unsigned char>
#define GC_LPBYTE _GC_Y<unsigned char>
#define GC_PSHORT _GC_Y<short>
#define GC_PUSHORT _GC_Y<unsigned short>
#define GC_PWORD _GC_Y <unsigned short>
#define GC_LPWORD _GC_Y<unsigned short>
#define GC_PINT _GC_Y<int>
#define GC_LPINT _GC_Y<int>
#define GC_PUINT _GC_Y<unsigned int>
#define GC_LPUINT _GC_Y<unsigned int>
#define GC_PLONG _GC_Y<long>
#define GC_LPLONG _GC_Y<long>
#define GC_PULONG _GC_Y<unsigned long>
#define GC_PDWORD _GC_Y<unsigned long>
#define GC_LPDWORD _GC_Y<unsigned long>
#define GC_PFLOAT _GC_Y<float>
#define GC_LPVOID _GC_Y<char>
#define GC_OBJECTS(_X) _GC_Z<_X>()
#define GC_OBJECT(_X, _Y) _GC_Z<_X>()(new _X##_Y)
#define GC_BOOL _GC_Z<bool>()
#define GC_STR _GC_Z<char>()
#define GC_CHAR _GC_Z<char>()
#define GC_UCHAR _GC_Z<unsigned char>()
#define GC_BYTE _GC_Z<unsigned char>()
#define GC_SHORT _GC_Z<short>()
#define GC_USHORT _GC_Z<unsigned short>()
#define GC_WORD _GC_Z<unsigned short>()
#define GC_INT _GC_Z<int>()
#define GC_UINT _GC_Z<unsigned int>()
#define GC_LONG _GC_Z<long>()
#define GC_ULONG _GC_Z<unsigned long>()
#define GC_DWORD _GC_Z<unsigned long>()
#define GC_FLOAT _GC_Z<float>()
#define GC_VOID _GC_Z<char>()
#ifdef _UNICODE
#define GC_PTSTR GC_PWORD
#define GC_LPTSTR GC_LPWORD
#define GC_PTCHAR GC_PWORD
#define GC_LPTCHAR GC_LPWORD
#define GC_TCHAR GC_WORD
#else
#define GC_PTSTR GC_PSTR
#define GC_LPTSTR GC_LPSTR
#define GC_PTCHAR GC_PCHAR
#define GC_LPTCHAR GC_PCHAR
#define GC_TCHAR GC_CHAR
#endif
#endif /* end _GARBAGE_COLLECT_H */