2011-07-21 6 views
6

20.6.9:C++デフォルトアロケータ - サイズがallocateの呼び出しに渡されたサイズと等しくない場合、どうなるべきですか?

void deallocate(pointer p, size_type n); 
  • 要件:pが割り当てから得られたポインタ値()でなければなりません。 nは、pを返すallocateの呼び出しに最初の引数として渡された値と等しくなります。
  • 影響:pによって参照される記憶域の割り当てを解除します。
  • 備考:(void *型)(18.6.1)演算子は、削除::使用しますが、この関数が呼び出されたとき、それは指定されていません。 npを返さ割り当ての呼び出しへの最初のagrgumentとして渡された値と等しくない場合にどうするか

?割り当てを解除しませんか? std::bad_allocを投げますか? ...

EDIT: 私は実際に「何が起こる必要がある」との意味は何だった:それは投げるか、カスタム実装に主張しても大丈夫でしょうか?何も未定義の動作につながる要件に違反し、明示的に記載されていないC++標準、中

いつものように

答えて

10

常時なければならないことを意味しましょう、それは必要条件ではなく、C++標準ではオプションです。ここで例えば

は何MSDN saysだ:

_ptr *がこれに等しい比較アロケータオブジェクトに割り当てる呼び出しによって以前に返されていなければならないポインタ、同じサイズおよびタイプの配列オブジェクトを割り当てます。

これは、サイズが正確に一致する必要があることを意味します。それ以外の場合は、定義されていない動作になります。

+2

ところで、Microsoftの実装を.:は... – 0xbadf00d

+1

@FrEEzE渡されたサイズを無視する - それはそれは**であることを**があることを知っているので、実装は、パラメータを無視することができます。割り当てサイズ自体を覚えていない場合は、他の実装でも使用できます。 –

+0

サイズを無視することは、未定義の動作の有効な種類の1つです。 –

3

それは言っていません。それは厄介な "未定義の行動"であることを意味します。

+0

はい、わかっています。しかし、サイズが割り当てられたサイズと一致しない場合(カスタム実装で)スローするかアサートするのがよいかどうかを知りたいです。 – 0xbadf00d

+2

未定義の場合は、何でもできます。標準コンテナは必ず正しい値を渡します。あなた自身のコンテナ**のために**あなたは行動を定義することができます。 :-) –

1

これはそのポインタからの割り当てのサイズがわからないアロケータの基礎となる可能にするために、標準的に存在しています。

たとえば、AmigaOSアロケータは空きメモリブロックのリストを保持し、部分的な割り当て解除も許可します(つまり、1024バイトを割り当て、オフセット512で512バイトを解放すると、256バイトの割り当てが2つになります)。アロケータはこの情報をデアロケータに渡すことを期待しています。

関連する問題