题
因此,我正在努力轻松地进行内存池C ++对象的方法,而需要汇总的类所需的最小修改。
内存池本身是您可以在任何地方找到的标准品种,但是我已经完成了此类:
Poolable::Poolable(MemPool& lepool){
mempool = &lepool;
}
Poolable::~Poolable(){
mempool->returnMemory((char*)this);
}
void * Poolable::operator new(size_t size, MemPool& lepool){
if(!lepool.initialised())
lepool.initializeBasedOnSize(size);
return lepool.getMemory(size);
}
void Poolable::operator delete(void * p){
// do absolutely NOTHING
}
用法:
class SomeSubclass : public Poolable { /* boring details here */ };
MemPool thepool(1000);
SomeSubclass * woot = new(thepool) SomeSubclass(thepool);
我想将返回信息呼叫(基本上可以使池的一部分释放)放在删除操作员中,但不知道如何从void*参数中获取实际池的地址。
取而代之的是,我通过将其放入破坏者中来解决。我认为构造函数要求使用池分配课程,这意味着破坏总是意味着未分配。
这是第一个工作解决方案,使用非常方便。但是,这样做可能是不好的风格,我很好奇这个问题是否有更好的解决方案。
有人知道吗?
解决方案
另一种方法是制作 Poolable::operator new
分配内存 thepool
这样您就可以使用常规(非置换) new
语句。在您的解决方案中,用户必须记住,这些对象应通过某些特殊技术分配,这显示了太多的详细信息,并给用户代码带来了太多负担。
不隶属于 StackOverflow