在基于回调的模块边界,经常出现需要延迟释放一个对象以便回调者进行一定的操作的情况.如果用定时器又比较麻烦.用内存池也不是很方便.
下面给出一种最简洁的解决方法:
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());


本文介绍了一种用于延迟删除对象的简洁方法。通过使用模板类`DelayCleaner`,可以在回调或特定场景中延迟对象的销毁过程,避免了使用定时器或内存池的复杂性。
1万+

被折叠的 条评论
为什么被折叠?



