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);

FAQ 項目全体をもう一度読むと、そこにあることがわかります。

于 2010-02-24T00:05:50.923 に答える
1

それは無理だ。Bjarne は、正しいプールを見つけ出すことは決して正しくないと説明しています。彼の解決策は次のとおりです。すべてのデストラクタを手動で呼び出してから、正しいプールを見つけて、メモリを手動で解放できるようにする必要があります。

参考文献:

Bjarne の FAQ:プレースメントの削除はありますか?

関連する C++ 標準セクション:

3.7.3.2.2 削除式では、size_t 型の引数を持つメンバー演算子の削除関数のみが考慮されます。

5.3.5.1 削除式の構文では、追加のパラメーターを使用できません。

于 2010-02-24T14:25:14.593 に答える