C++;子类化内存池 我正在努力一种方法,用最小的修改来实现池内存C++对象,需要对需要汇集的类进行修改。

C++;子类化内存池 我正在努力一种方法,用最小的修改来实现池内存C++对象,需要对需要汇集的类进行修改。,c++,memory-pool,C++,Memory Pool,内存池本身是任何地方都可以找到的标准类型,但我制作了以下类: Poolable::Poolable(MemPool& lepool){ mempool = &lepool; } Poolable::~Poolable(){ mempool->returnMemory((char*)this); } void * Poolable::operator new(size_t size, MemPool& lepool){

内存池本身是任何地方都可以找到的标准类型,但我制作了以下类:

  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);
我想将returnMemory调用(基本上释放池的一部分)放在delete操作符中,但不知道如何从void*参数中获取实际池的地址

相反,我把它放进了析构函数。我认为构造函数要求使用池分配类,这意味着销毁总是意味着随后将发生未分配

这是第一个有效的解决方案,使用起来非常方便。然而,这样做可能是不好的方式,我很好奇是否有更好的解决方案


有人知道吗?

另一种方法是使
Poolable::operator new
pool
分配内存,这样您就可以使用常用的(非放置的)
new
语句。在您的解决方案中,用户必须记住,这些对象将通过一些特殊的技术来分配,这显示了太多的细节,并且给用户代码带来了太多负担。

阅读现代C++设计:AH…我不太明白。。你能详细说明一下让“操作员新”从工具中分配内存是什么意思吗?你的意思是以一种不同于它已经在做的方式吗?kamziro:如果你不需要更多的池,你可以声明一个全局变量,并使
操作符成为新的
使用它。哦,对了,我确实计划有多个池,但是谢谢你的想法。@kamziro:即使有几个池,你也可以使用一个全局对象(指针)调用“当前池”并使操作员新建
从该池分配。然后,在执行
new
之前,您可以使用括号类切换到所需的池-这样,您可以切换到所需的池并调用一组代码,由该代码分配的所有对象都将分配到该池中,而无需为每个分配分别显式指定它。