続・「C++のコンストラクタで例外を投げてはいけない」は迷信
id:ototoiさんにいろいろ教えてもらったのでメモ。
配列を動的確保していた場合はどうするか?
boost::scoped_arrayを使う。
スマートポインタを使わない場合のメモ
コンストラクタのcatch節とデストラクタの内容がかぶるので、そこを関数化しておくと便利。
こんな感じ:
class Hoge { public: Hoge() { try { initialize(); } catch(...) { destroy(); throw; } } ~Hoge() { destroy(); } void initialize(); void destroy(); };
追記:
throw;が抜けていたので修正しました。
また、function try blockを使う事で、以下のように書くことも出来ます。
Hoge() try { initialize(); } catch(...) { destroy(); /* throw; */ // これは自動で再throwされる }