7

allocateメソッドに 0 が渡された場合に例外をスローしても問題ありませんか?

ありがとうございました。

PS

n == 0 の場合、戻り値は規定されていません。

allocate例外をスローしてはならないということですか?n==0 でスローが許可されていない場合、標準で明確に説明されていると思います。

4

2 に答える 2

7

標準が言わなければならないことはすべて(§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すべきではありません。解釈の余地はあると思いますが、個人的には後者を支持し、それを並外れたコードパスと考えています。

于 2011-05-19T23:28:07.683 に答える
5

標準では、サイズの割り当てが、関連する標準パラグラフを探して、バイト サイズ 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 の場合、戻り値は規定されていません。—終わりのメモ]

(私のものを強調してください。)ですから、何かのリターンがそのメモによって暗示されている
ので、投げてはいけません。ただし、バイト サイズのメモリ ブロックを返す必要はありません。したがって、あなたの質問に答えるには:いいえ、サイズ要求が標準準拠のアロケーターを実装するときにスローすることは許可されていません。1allocate0

于 2011-05-19T23:08:18.543 に答える