allocate
メソッドに 0 が渡された場合に例外をスローしても問題ありませんか?
ありがとうございました。
PS
n == 0 の場合、戻り値は規定されていません。
allocate
例外をスローしてはならないということですか?n==0 でスローが許可されていない場合、標準で明確に説明されていると思います。
標準が言わなければならないことはすべて(§20.1.5/2)、与えられたものです
T
- いかなるタイプX
– タイプのAllocatorクラスT
a
– タイプの値X&
n
– タイプの値X::size_type
,0 に等しい場合、式の戻り値a.allocate(n)
は指定されません。n
一方でX::allocate
は、義務付けられた例外仕様がなく、明示的にスローされる可能性があることstd::bad_alloc
を考えると、他のタイプの例外もスローできない理由がわかりません。一方、文言は がゼロに等しい条件を明確に呼び出し、戻り値があることを直接暗示します。つまり、スローn
すべきではありません。解釈の余地はあると思いますが、個人的には後者を支持し、それを並外れたコードパスと考えています。
標準では、サイズの割り当てが、関連する標準パラグラフを探して、バイト サイズ Brb0
のメモリ ブロックへのポインタを返すことを要求しています。1
編集:
まず、C++0x/11 の FDIS しか手に入らなかったのですが (家にはありません...)、C++98/03 の文言は似ていたと思います。
次に、私が間違っていたようです。アロケータが size のメモリ ブロックを返すとはどこにも述べられていません1
。私の記憶は間違っていました。:( ただし、3.7.4.2 [basic.stc.dynamic.allocation] p2 の下にこの小さな段落が見つかりました:
要求されたスペースのサイズがゼロであっても、要求は失敗する可能性があります。要求が成功した場合、値 p1 が後でオペレーター delete に渡されない限り、返される値は、以前に返された値 p1 とは異なる非 null ポインター値 (4.10) p0 になります。サイズ 0 の要求として返されたポインターを逆参照した場合の影響は未定義です。35)
同じサイトの最後に:
35) std::malloc() または std::calloc() を呼び出すことによって演算子 new() を実装できるようにすることを意図しているため、ルールは実質的に同じです。C++ は、null 以外のポインターを返すためにゼロ要求を必要とする点で C とは異なります。
(私のものを強調してください。)
現在、FDIS は、17.6.3.5
[allocator.requirements] の下のメモでallocate
次のように述べています。
a.allocate(n) X::pointer
n
タイプのオブジェクトにメモリが割り当てられますT
が、オブジェクトは構築されません。allocate
適切な例外を発生させる場合があります。[ 注: n == 0 の場合、戻り値は規定されていません。—終わりのメモ]
(私のものを強調してください。)ですから、何かのリターンがそのメモによって暗示されている
ので、投げてはいけません。ただし、バイト サイズのメモリ ブロックを返す必要はありません。したがって、あなたの質問に答えるには:いいえ、サイズ要求が標準準拠のアロケーターを実装するときにスローすることは許可されていません。1
allocate
0