catch節で例外オブジェクト受け取るには、ポインタ、値、参照渡しの3つの方法がある。
結論は参照渡しで受け取るのがベスト
ポインタ渡し
効率が良いが、ポインタが指し示す例外オブジェクトの保証が必要。void func() { exception e; // ローカル。スコープから出たら破棄される。 ... throw &e; // 破棄されるオブジェクトのポインタを投げる事になる。 }(受け取った時)例外オブジェクトは誰が破棄するのか不透明。
static exception e; throw &e;
throw new exception;
値渡し
例外が発生するたびに2回コピーされる(ので生成処理が2回発生する)基底クラスのオブジェクトとして受け取ると、派生クラスのデータは欠落する。
参照
例外のコピーは1回で済む。派生クラスのデータも欠落しない。try { throw exception(); } catch (exception& e) { cerr << e.what() << endl; }
参考/引用
0 件のコメント:
コメントを投稿