在基于回调的模块边界,经常出现需要延迟释放一个对象以便回调者进行一定的操作的情况.如果用定时器又比较麻烦.用内存池也不是很方便.
下面给出一种最简洁的解决方法:
template
<
typenameT,
int
BufferSize
=
10
>
class DelayCleaner
... {
public:
DelayCleaner(void)
...{
_index=0;
memset(_bufferArray,0,sizeof(T*)*BufferSize);
}
virtual~DelayCleaner(void)
...{
for(inti=0;i<BufferSize;i++)
...{
delete_bufferArray[_index];
_bufferArray[_index]=NULL;
_index++;
_index%=BufferSize;
}
}
voidAddObjToBuffer(T*obj)
...{
if(_bufferArray[_index]!=NULL)
...{
delete_bufferArray[_index];
}
_bufferArray[_index]=obj;
_index++;
_index%=BufferSize;
}
voidDelayDelete(T*obj)
...{
AddObjToBuffer(obj);
}
private:
unsignedint_index;
T*_bufferArray[BufferSize];
} ;
// 需要延迟删除的对象
class Target
... {
public:
Target()
...{
}
~Target()
...{
}
} ;
// 测试代码:
DelayCleaner < Target, 5 > targetBuffer;
for ( int i = 0 ;i < 8 ;i ++ )
targetBuffer.DelayDelete( new Target());
class DelayCleaner
... {
public:
DelayCleaner(void)
...{
_index=0;
memset(_bufferArray,0,sizeof(T*)*BufferSize);
}
virtual~DelayCleaner(void)
...{
for(inti=0;i<BufferSize;i++)
...{
delete_bufferArray[_index];
_bufferArray[_index]=NULL;
_index++;
_index%=BufferSize;
}
}
voidAddObjToBuffer(T*obj)
...{
if(_bufferArray[_index]!=NULL)
...{
delete_bufferArray[_index];
}
_bufferArray[_index]=obj;
_index++;
_index%=BufferSize;
}
voidDelayDelete(T*obj)
...{
AddObjToBuffer(obj);
}
private:
unsignedint_index;
T*_bufferArray[BufferSize];
} ;
// 需要延迟删除的对象
class Target
... {
public:
Target()
...{
}
~Target()
...{
}
} ;
// 测试代码:
DelayCleaner < Target, 5 > targetBuffer;
for ( int i = 0 ;i < 8 ;i ++ )
targetBuffer.DelayDelete( new Target());