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

Tob*_*ias 8 c++ arrays memory-management memory-pool delete-operator

我想知道如何将C++ - FAQ-lite的第11.14节适用于数组.

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

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;
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚声明和调用它的正确语法operator delete[] (pool).有人可以帮忙吗?

Tob*_*ias 1

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

参考:

Bjarne 的常见问题解答:是否存在展示位置删除?

相关 C++ 标准部分:

3.7.3.2.2 删除表达式仅考虑带有 size_t 类型参数的成员运算符删除函数。

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