operator new[]
アロケータとして使用する STL 実装はありますか? 私のコンパイラでは、Foo::operator new[]
private を作成しても ... を作成できませんでしたvector<Foo>
。その動作は何かによって保証されていますか?
5 に答える
C++ 標準、セクション 20.4.1.1。デフォルトのアロケーターの allocate() 関数は、グローバル演算子 new を使用します。
pointer allocate(size_type n, allocator<void>::const_pointerhint=0);
3 Notes: Uses ::operator new(size_t) (18.4.1).
std ライブラリの実装は、std::allocator に T::operator new[] を使用しません。それらのほとんどは、バックグラウンドで独自のメモリ プール インフラストラクチャを使用しています。
一般に、オブジェクトが動的に割り当てられるのを止めたい場合Foo
は、すべてのコンストラクターを非公開にし、オブジェクトを作成する関数を提供する必要がありFoo
ます。もちろん、それらをauto
変数として作成することもできません。
std::vector は、テンプレート引数として渡される Allocator を使用します。これは、デフォルトで std::allocate になります。ただし、アロケータは機能しません。new[]
生のメモリを割り当てるだけでnew
、オブジェクトを追加するように指示すると、そのメモリ内にオブジェクトを実際に作成するために配置が使用されます (たとえば、push_back()
またはを使用resize()
)。
アロケーターで使用できる唯一の方法はnew[]
、少し乱用し、のようなものを使用して生のスペースを割り当てた場合ですnew char[size];
。乱用が進むにつれて、それはかなり無害ですが、それでもnew[]
クラスの過負荷とは無関係です。
オブジェクトの作成を禁止したい場合は、 ではなくプライベート コンストラクターを作成しますoperator new
。