3

まず、そうではないと思います。しかし、デバッグ モードの MSVC 10.0 でこのような動作を確認しました。allocatorユーザーが同じインスタンスに割り当てられたポインターのみを に渡すことに依存するカスタム クラスを使用していますdeallocate。ただし、リリース モードでは、私のコードは機能しています。

これはバグですか、それとも私が間違っていますか?

4

1 に答える 1

6

この標準では、まったく異なるインスタンスであっても、すべてのアロケータが同じタイプの他のアロケータによって生成されたメモリの割り当てを解除できる必要があります。list::spliceこれは正しく機能するために必要です。これは主にC++仕様の設計上の欠陥と見なされており、C ++ 0xでは、これを修正するためにアロケータに一連の修正プログラムを導入しています。それまでの間、STLコンテナーで使用するアロケーターは、独自のローカル状態を持ってはなりません。

編集:これに元の言語が必要な人のために、C ++ISO仕様の§20.1.5/4があります:

この国際規格に記載されているコンテナの実装では、アロケータテンプレートパラメータが表32の要件を超える次の2つの追加要件を満たしていることを前提としています。

—特定のアロケータタイプのすべてのインスタンスは交換可能であり、常に互いに同等に比較される必要があります。

C ++ 0x標準の最新のISOドラフトでは、この要件はなくなりました。デフォルトstd::allocatorでは、必要に応じてこの不変条件が維持されますが、将来このように制約する必要はないようです。

于 2011-07-24T07:05:46.963 に答える