因此,我正在努力轻松地进行内存池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 语句。在您的解决方案中,用户必须记住,这些对象应通过某些特殊技术分配,这显示了太多的详细信息,并给用户代码带来了太多负担。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top