「プログラミング言語C++第四版」について気が付いたことなど (3)

どっちなの?


13. 5. 2   例外 の 捕捉

…(中略)…

原則として、例外は送出時にコピーされる(§13.5)。そのため、例外の保持と転送に対して、処理系はさまざまな方針を適用できる。とはいえ、newが、標準のメモリ不足例外bad_allocを送出するのに必要なメモリがあることは保証されている(§11.2.3)。


と書いてあるので、あれ? と思って §11.2.3 を見てみると、


11.2.3 メモリ領域の割り当て

…(中略)…

どれだけ多くのメモリがあっても、最終的にはbad_allocハンドラが実行される。ここで注意してほしいのは、物理メモリを使い果たすと、new演算子が例外を送出する保証がない、ということだ。


となっている。(太字強調は私)

§13.5.2の原文は

It is guaranteed, howerver, that there is sufficient memory to allow new to throw the standard out-of-memory exception, bad_alloc(§11.2.3)

§11.2.3の原文は

However much memory we have available, this will eventually invoke the bad_alloc handler. Please be careful: the new operator is not guaranteed to throw when you run out of physical main memory.

となっており、訳は間違っていない。

現実的にはbad_alloc例外がthrowされるような事態になることは稀で、なったらなったで適当に落ちてくれれば多くの場合さしたる不都合は無いと思うし、プログラム側で例外処理を書いたとしてもどのみちまともに動かない可能性の方が高いとも思うのだけれども、例外がthrowされる保証があるのか無いのかすっきりしないのは気持ちが悪い。

§13.5.2では「例外をthrowするために必要最低限のメモリはnewの処理として常に残してある」と言っているだけで、だからと言って実際に例外をthrowできるとは限らない、ということなのだろうか?

 

コメントを残す