|
いままではメモリの確保に malloc を使用している例を挙げましたが、C++ では本当はあまりこういうことをしません。実際には new 演算子を使います。前のトピックのコードを new を使って書き換えてみます。 |
|||
|
|
||||
|
set_new_handler という関数を使って new ハンドラを設定しています。new ハンドラとは、new 演算子がメモリ確保に失敗したときに呼び出されるコールバックです。上の例では、new が失敗したときに MyNewHandler が実行され、例外が throw されて main 中の catch で異常終了するようになっています。 このように、new と new ハンドラと try-catch-throw の組み合わせで非常にスマートなメモリ不足チェックが行えるようになります。 |
|||
|
ところで、new はデフォルトではメモリ確保失敗時に 0(NULL) を返します。したがって、次のような書き方は間違いです。 |
|||
|
|
||||
|
なぜ間違いかというと、new が 0 を返した場合に *pi への代入でシステムエラーが発生するためです。すでに説明した通り、実行時エラーは必ずチェックしなければなりません。しかし new ハンドラで throw することによって new は 0 を返さなくなります。このページの2つの例にある new の使い方は局所的には全く同じように見えますが、本当は全然違うというわけです。 |
|||
(「プログラミングのはなし」は1998年1月から1999年1月にかけて作成されたコンテンツです。)