8

我想知道如何使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;
}

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

4

2 回答 2

2

首先调用单个对象上的 dtors,然后使用:

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

您可以再次阅读整个常见问题解答项目,您会在那里找到它。

于 2010-02-24T00:05:50.923 回答
1

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

参考:

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

相关的 C++ 标准部分:

3.7.3.2.2 只有具有 size_t 类型参数的成员运算符删除函数才被考虑用于删除表达式。

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

于 2010-02-24T14:25:14.593 回答