如何声明和使用重载池操作符删除?

时间:2010-02-24 00:03:20

标签: c++ arrays memory-management delete-operator memory-pool

我想知道如何使section 11.14 of the C++-FAQ-lite适应数组。

基本上,我想要这样的东西:

class Pool {
public:
  void* allocate(size_t size) {...}
  void deallocate(void* p, size_t size) {...}
};

void* operator new[](size_t size, Pool& pool) { return pool.allocate(size); }
void operator delete[](void* p, size_t size, Pool& pool) { pool.deallocate(p, size); }

struct Foo {...};

int main() {
  Pool pool;

  Foo* manyFoos = new (pool) Foo [15];

  /* ... */

  delete [] (pool) manyFoos;
}

但是,我无法找出声明和调用此operator delete[] (pool)的正确语法。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

首先在各个对象上调用dtors,然后使用:

for (int i = 0; i < 15; ++i) manyFoos[ i ]->~Foo();
operator delete[] (manyFoos, pool);

您可以再次阅读整个FAQ项目,您将在那里找到它。

答案 1 :(得分:1)

这是不可能的。 Bjarne认为你永远不会正确找出正确的游泳池。他的解决方案是:您必须手动调用所有析构函数,然后找出正确的池才能手动释放内存。

参考文献:

Bjarne的常见问题:Is there a placement delete?

相关的C ++标准部分:

3.7.3.2.2对于删除表达式,只考虑使用size_t类型参数的成员操作符删除函数。

5.3.5.1删除表达式语法不允许使用额外的参数。