我刚刚在代码中发现了以下宝石(示例非常简化,但逻辑相同):
template <class T>
class garbage_bin
{
private:
garbage_bin<T>(void)
{
}
static garbage_bin<T>* pinstance;
public:
static garbage_bin<T>& instance()
{
if(pinstance == NULL)
{
pinstance = new garbage_bin<T>();
}
return *pinstance;
}
void empty()
{
for(size_t i=0; i<items.size(); i++)
{
free (items[i]);
}
}
void throwIn(T item)
{
items.push_back(item);
}
vector<T> items;
};
然后在代码中的某个地方(这只是一个例子......有成千上万这样的例子):
char* r = strdup(src);
garbage_bin<char*>::instance().throwIn(r);
稍后在代码中的某个地方,就在退出之前...
garbage_bin<char*>::instance().empty();
garbage_bin<molecules*>::instance().empty();
garbage_bin<CDatabaseUsers*>::instance().empty();
等等 ...
如我们所见,这实现了一个垃圾箱类,您可以在其中“放入”所有类型的对象,并在稍后阶段为避免内存泄漏,您可以“清空”垃圾箱。但是这里有一个大瓶颈:为了让它正常工作,你需要知道这个垃圾箱被实例化的所有类,以便清空它们......
我想到的最直接的解决方案是typeid
为实例创建一个调用映射,并将 分配garbage_bin<T>::instance()
给名称,但是一个古老的编译器决定他不喜欢这种方法。
显然,我可以通过代码搜索找到所有模板,但我想知道......有没有更简单的方法来做到这一点?