コンストラクタでの例外送出

コンストラクタ内で例外を送出する危険性についてざっと調べてみたところ、

の二つが大体のところだと思うんだが、どっちも空間的資源についてしか言及してない…、よな?つまるところメモリリークが怖いからコンストラクタ内で例外送出しないようにしよう、って話しだ。

で、俺が困っているのはboost::filesystem::pathのコンストラクタの挙動なわけで。boost::filesystemはかなり、というか滅茶苦茶便利なんだけども、コンストラクタ内でname_check functionというものを呼んでいるらしく。こいつは移植性を保証するために妥当な(valid)ディレクトリ/ファイル名であるかを勝手に検証してくれるものらしいんだけど、妥当でない(invalid)名前が来ると例外送出するようになっている。この一見厳しすぎる挙動は設計者の移植性に対する姿勢をうかがえるものなんだけど、自前クラスのコンストラクタでboost::filesystem::pathオブジェクトを初期化したい場合、例外を投げられる可能性が出てくるわけで。

で、「コンストラクタで例外送出が起きた場合、問題は本当にメモリリークだけなのか?」という点が問題なわけですよ。逆にいうとメモリリークが起きないことがわかっているなら、コンストラクタで例外を投げてもいいのか?」ってことだ。コンストラクタでnewによるメモリ確保は行わないつもりなんだけど、例外投げちゃっていいのかな?一応メンバオブジェクトのboost::filesystem::pathをstd::stringに置き換えて、パス文字列の処理が必要なところでpathオブジェクトを構築する、という手もあるんだけど…。name_checkの恩恵を受けるのがタイミング的に遅くなるし、スッキリ書けなくなるというデメリットもあるわけで。

プログラミング言語C++ (アスキーアジソンウェスレイシリーズ―Ascii Addison Wesley programming series)を持ってないからなぁ…。放置か?(ぉ