ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
プログラミングのはなし

new ハンドラを使う

いままではメモリの確保に malloc を使用している例を挙げましたが、C++ では本当はあまりこういうことをしません。実際には new 演算子を使います。前のトピックのコードを new を使って書き換えてみます。

SAMPLE
CODE
#include<new>
void MyNewHandler();
void Sub();

void main()
{
    set_new_handler( MyNewHandler );

    try {
        Sub();
    }
    catch ( ... ) {
        ABORT();
    }
}

void MyNewHandler()
{
    throw "NO MEMORY!";
}

void Sub()
{
    int *pi = new int;
    *pi = 100;
}

set_new_handler という関数を使って new ハンドラを設定しています。new ハンドラとは、new 演算子がメモリ確保に失敗したときに呼び出されるコールバックです。上の例では、new が失敗したときに MyNewHandler が実行され、例外が throw されて main 中の catch で異常終了するようになっています。

このように、new と new ハンドラと try-catch-throw の組み合わせで非常にスマートなメモリ不足チェックが行えるようになります。

ところで、new はデフォルトではメモリ確保失敗時に 0(NULL) を返します。したがって、次のような書き方は間違いです。

SAMPLE
CODE
void main()
{
    int *pi = new int;
    *pi = 100;
}

なぜ間違いかというと、new が 0 を返した場合に *pi への代入でシステムエラーが発生するためです。すでに説明した通り、実行時エラーは必ずチェックしなければなりません。しかし new ハンドラで throw することによって new は 0 を返さなくなります。このページの2つの例にある new の使い方は局所的には全く同じように見えますが、本当は全然違うというわけです。

(「プログラミングのはなし」は1998年1月から1999年1月にかけて作成されたコンテンツです。)