21

STLアロケータを使用するコンテナクラスを作成しようとしています。私が現在していることは、プライベートメンバーを持つことです

std::allocator<T> alloc_;

(これは後でテンプレート化され、ユーザーが別のアロケータを選択できるようになります)次に呼び出します

T* ptr = alloc_.allocate(1,0);

新しく割り当てられた「T」オブジェクトへのポインタを取得します(そして、alloc_.constructを使用してコンストラクタを呼び出します。以下の回答を参照してください)。これはGNUC++ライブラリで機能します。

ただし、Solaris上のSTLPortでは、これは正しいことを行うことができず、あらゆる種類の奇妙なメモリ破損エラーが発生します。私が代わりにやるなら

std::allocator_interface<std::allocator<T> > alloc_;

その後、すべて正常に機能しています。

stl :: allocatorを使用する正しい方法は何ですか?STLPort /Solarisバージョンはg++でコンパイルできませんが、g ++は正しいですか?

4

2 に答える 2

16

アロケーターを使用して、割り当てと構築の両方を行う必要があります。このようなもの:

T* ptr = alloc_.allocate(1,0);
alloc_.construct(ptr, value);

適切に構築されたオブジェクトから始めないと、多くのものが完全に壊れてしまいます。std::string割り当てられているが構築されていないことを想像してください。それに代入しようとすると、まず一部のデータを解放して古い内容をクリーンアップしようとしますが、これはもちろんヒープからのガベージ値であり、クラッシュします。

于 2010-03-24T16:45:34.987 に答える
9

allocator標準コンテナがアロケータとどのように相互作用するかを確認するために使用できる独自のカスタムを用意することもできます。Stephan T. Lavavej は、mallocator. これを、さまざまな STL コンテナーを使用するテスト プログラムにドロップすると、アロケーターが標準コンテナーでどのように使用されているかを簡単に確認できます。

のインターフェイス関数mallocator( や などconstruct())のdestroy()すべてにトレース出力が装備されているわけではないため、トレース ステートメントをそこにドロップして、標準コンテナーがデバッガーに頼らずにこれらの関数をどのように使用するかをより簡単に確認したい場合があります。

これにより、コンテナがカスタムをどのように使用することが期待されるかについての良いアイデアが得られるはずですallocator.

于 2010-03-24T17:42:37.527 に答える