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