どのように宣言すると、削除オーバーロードプール演算子を使用していますか?
-
22-09-2019 - |
質問
私はのセクション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項目を読むことができ、あなたがそこにそれを見つけるでしょう。
所属していません StackOverflow