2

STL 用のスタック ベースのアロケータを作成しています。アイデアは、メモリの大きなチャンクを一度割り当て、オブジェクトが構築されている間に蓄積させ、必要に応じてゼロにリセットすることです。たとえば、ゲームのレベル情報や、ゲーム ループの 1 回の反復で作成されるオブジェクトのレベル情報を格納するために使用できます。スタックを構築するレベルをロードするとき、新しいレベルをロードする必要があるときは、トップ ポインターを先頭にリセットするだけで、OS 呼び出しは必要ありません。

今私の問題は、標準アロケーターが物事を行う方法、つまりdeallocate()関数です。この記事ではそれを読むことができます

デフォルトのアロケーターでは、ストレージのブロックは ::operator delete を使用して割り当て解除されます。

これは、deallocate()関数を使用することで、メモリが解放され、デストラクタが呼び出されることを意味します。deallocate()個々のオブジェクトのメモリの割り当てを解除するつもりはないので、私のアロケータの目的のために、関数を空にすることができます。

問題は、STL コンテナーがアロケーター クラスを使用して新しいオブジェクトを作成する方法です。デフォルトのアロケータはnewanddeleteを使用するため、コンテナは or を呼び出しますconstruct()destroy()? deallocate()関数に記述子も呼び出させる必要がありますか?

allocate()同じ質問がandconstruct()メソッドにも当てはまると思います。

4

1 に答える 1

6

これは、deallocate()関数を使用することにより、メモリが解放され、デストラクタが呼び出されることを意味します。

いいえ、そうではありません。::operator deleteはグローバル削除機能であり、メモリを解放するだけです。名前が類似しているにもかかわらず、演算子は別のものです。delete演算子は破棄してから、削除関数(グローバル削除関数またはオーバーロードのいずれか)を呼び出します。

デストラクタはdestroy、アロケータの機能によって呼び出されます。

標準のコンテナはallocate、メモリを取得するために使用します。次にconstruct、要素を含むためにそのメモリが必要な場合、および必要なdestroy場合にのみconstructdeallocateメモリを解放します。例えば:

{
    std::vector<int> v; // may or may not call anything on the allocator
    v.reserve(10000); // calls 'allocate'
    v.resize(100); // calls 'construct' 100 times
    v.resize(50); // calls 'destroy' 50 times
} // destructor calls 'destroy' 50 times and then 'deallocate'
于 2012-07-24T09:10:02.403 に答える