C++ 实现内存自动托管的模板类
C++ 2010-04-17 18:26:04 阅读45 评论0 字号:大中小 订阅
文/Fenying
使用Traits类特化实现内存的自动化托管,防止内存泄露。
原理是在作用域结束后自动释放所有申请了托管的动态内存。
/************************************************************************
* Safely Trusted Engine of Memory *
* *
* Language: C++ (ANSI 98 Standard) *
* Newest Version: 1.0 *
* *
* Author: Fenying *
* Details: An class used to automatically manage memory. *
* CopyRight: All CopyRights Fenying Studio 2007 - 2009 Reserved. *
* *
* Version: 1.0 *
* Author: Fenying *
* Time: 2009-10-23 *
* Details: http://fenying.blog.163.com *
************************************************************************/
#ifndef VOID
typedef unsigned int UINT;
#endif
template < class TSTEM , bool bIsArray = false >
class CStem;
/* Safely Trusted Engine of Memory Item */
template < class TSTEM , bool bIsArray = false >
class CStemItem
{
public :
friend class CStem < TSTEM , bIsArray >;
CStemItem( TSTEM * pItem)
{
m_pItem = pItem;
m_pPrevious = m_pNext = NULL;
}
~ CStemItem()
{
if ( m_pPrevious != NULL)
m_pPrevious -> m_pNext = m_pNext;
if ( m_pNext != NULL)
m_pNext -> m_pPrevious = m_pPrevious;
if ( m_pItem != NULL)
if ( bIsArray)
delete [] m_pItem;
else
delete m_pItem;
}
private :
TSTEM * m_pItem;
CStemItem < TSTEM , bIsArray > * m_pNext;
CStemItem < TSTEM , bIsArray > * m_pPrevious;
};
/************************************************************************/
/* Safely Trusted Engine of Memory */
template < class TSTEM , bool bIsArray >
class CStem
{
public :
CStem() {
m_pFirstItem = NULL;
m_nCount = 0;
}
~ CStem() {
FreeMemory();
}
TSTEM * New()
{
TSTEM * temp = new TSTEM;
if ( temp)
Trust( temp);
return temp;
}
TSTEM * NewArray( UINT nArraySize)
{
if ( ! bIsArray)
return NULL;
TSTEM * temp = new TSTEM [ nArraySize ];
if ( temp)
Trust( temp);
return temp;
}
void Trust( TSTEM * pItem)
{
if (
* Safely Trusted Engine of Memory *
* *
* Language: C++ (ANSI 98 Standard) *
* Newest Version: 1.0 *
* *
* Author: Fenying *
* Details: An class used to automatically manage memory. *
* CopyRight: All CopyRights Fenying Studio 2007 - 2009 Reserved. *
* *
* Version: 1.0 *
* Author: Fenying *
* Time: 2009-10-23 *
* Details: http://fenying.blog.163.com *
************************************************************************/
#ifndef VOID
typedef unsigned int UINT;
#endif
template < class TSTEM , bool bIsArray = false >
class CStem;
/* Safely Trusted Engine of Memory Item */
template < class TSTEM , bool bIsArray = false >
class CStemItem
{
public :
friend class CStem < TSTEM , bIsArray >;
CStemItem( TSTEM * pItem)
{
m_pItem = pItem;
m_pPrevious = m_pNext = NULL;
}
~ CStemItem()
{
if ( m_pPrevious != NULL)
m_pPrevious -> m_pNext = m_pNext;
if ( m_pNext != NULL)
m_pNext -> m_pPrevious = m_pPrevious;
if ( m_pItem != NULL)
if ( bIsArray)
delete [] m_pItem;
else
delete m_pItem;
}
private :
TSTEM * m_pItem;
CStemItem < TSTEM , bIsArray > * m_pNext;
CStemItem < TSTEM , bIsArray > * m_pPrevious;
};
/************************************************************************/
/* Safely Trusted Engine of Memory */
template < class TSTEM , bool bIsArray >
class CStem
{
public :
CStem() {
m_pFirstItem = NULL;
m_nCount = 0;
}
~ CStem() {
FreeMemory();
}
TSTEM * New()
{
TSTEM * temp = new TSTEM;
if ( temp)
Trust( temp);
return temp;
}
TSTEM * NewArray( UINT nArraySize)
{
if ( ! bIsArray)
return NULL;
TSTEM * temp = new TSTEM [ nArraySize ];
if ( temp)
Trust( temp);
return temp;
}
void Trust( TSTEM * pItem)
{
if (