どのように宣言すると、削除オーバーロードプール演算子を使用していますか?

StackOverflow https://stackoverflow.com/questions/2322742

質問

私はのセクション11.14を適応させる方法を知っていただきたいと思います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

それは不可能です。 Bjarneの理由は、あなたはそれが正しい正しいプールを考え出す得ることは決してないだろうということ。彼の解決策は以下のとおりです。手動で手動でメモリを解放することができるように、すべてのデストラクタを呼び出してから、正しいプールを把握しなければなりません。

参考ます:

BjarneのFAQ:は配置が削除あります

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

size_tの型の引数を持つ

3.7.3.2.2のみメンバ演算子の削除機能は、削除の表現のために考慮されます。

5.3.5.1削除表現の構文は、追加パラメータを許可していません。

他のヒント

最初の個々のオブジェクトにdtorsに電話して、使用します:

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

あなたは再び全体のFAQ項目を読むことができ、あなたがそこにそれを見つけるでしょう。

scroll top