现在的位置: 首页 > 综合 > 正文

一个简洁的延迟释放对象的解决方案

2013年04月22日 ⁄ 综合 ⁄ 共 1054字 ⁄ 字号 评论关闭

在基于回调的模块边界,经常出现需要延迟释放一个对象以便回调者进行一定的操作的情况.如果用定时器又比较麻烦.用内存池也不是很方便.

下面给出一种最简洁的解决方法 :

 

template<typename T,int BufferSize=10>
class DelayCleaner
{
public:
    DelayCleaner(
void)
    
{
        _index
=0;
        memset(_bufferArray,
0,sizeof(T*)*BufferSize);
    }

    
virtual ~DelayCleaner(void)
    
{
        
for(int i=0;i<BufferSize;i++)
        
{
            delete _bufferArray[_index];
            _bufferArray[_index]
=NULL;
            _index
++;
            _index
%=BufferSize;
        }

    }


    
void AddObjToBuffer(T* obj)
    
{
        
if(_bufferArray[_index]!=NULL)
        
{
            delete _bufferArray[_index];
        }

        _bufferArray[_index]
=obj;
        _index
++;
        _index
%=BufferSize;
    }

    
void DelayDelete(T* obj)
    
{
        AddObjToBuffer(obj);
    }


private:
    unsigned 
int  _index;
    T
*     _bufferArray[BufferSize];
}
;

// 需要延迟删除的对象
class Target
{
public:
    Target()
    
{

    }

    
~Target()
    
{

    }

}
;
// 测试代码:
    DelayCleaner< Target,5 > targetBuffer;
    
for(int i=0;i<8;i++)
        targetBuffer.DelayDelete(
new Target());



抱歉!评论已关闭.