これは、ベクトルが割り当てられたメモリを保持し、それにプッシュされるオブジェクトのインプレース構築 (=placement new) を行う必要があることを意味します。これは有効な仮定ですか?
はい
また、これはコンテナーが delete を呼び出すのではなく、手動でデストラクタを呼び出しているということですか?
はい
ここで見逃している他の仮定はありますか? これは、私が書くことを選択した場合、オブジェクトのカスタム作成された新しいものでさえ呼び出されない可能性があると想定できることを意味しますか?
はい。リンクされたリストであっても、コンテナーは型のインスタンスを割り当てず、型のサブオブジェクトを含むテンプレート化された構造を割り当てることを考慮してください。少なくとも 2 つのポインター (両方のリンク) とその型のサブオブジェクトを含む複合型になるリンク リストの場合。割り当てられる実際のタイプは、あなたのタイプではなく、そのnodeです。
また、継続的なメモリ保証が必要ないため、リストで new と delete を使用することも理にかなっています。
それはしますが、そうではありませんnew
/delete
あなたのタイプのオブジェクト。
では、この種の動作は、アロケータの動作を駆動するものですか?
質問のこの部分がよくわかりません。アロケーターは、標準で定義された一連の制約を持つクラスであり、インターフェイス ( allocate
、deallocate
...) とセマンティクス (の意味は==
、一方に割り当てられたメモリを他方で割り当て解除できるということです。クラス内の他の状態は関係ありません)。
malloc
アロケーターは、効率など、さまざまな理由で作成してコンテナーに渡すことができます (オブジェクトの型のみを割り当てる場合は、状況に応じて、より効率的な小さなブロック アロケーターを実装できる場合もあります)。
配置に関する補足事項 new
私はいつも興味深いことに、placement newは 2 つの異なる意味を持つように思われる用語です。一方では、オブジェクトをその場で構築する唯一の方法です。しかし、それはまったく別の意味も持っているようです:カスタムアロケータからメモリを取得するこのオブジェクトを構築します。
実際、配置 newには、 in-place の構築とは関係のない単一の意味があります。1 つ目は、18.4.1.3 で定義されているようにアロケータが実装 (コンパイラ) によって提供され、オーバーロードできない場合の 2 つ目のケースです。void*
オーバーロードされたアロケーターの特定のバージョンは、引数 ( ) を返すだけで、 new-expressionがそれをコンストラクターに渡し、呼び出された新しいバージョンの配置によって割り当てられた (ない) メモリ上にオブジェクトを構築できるようにするだけです。