質問: try{}catch(){}とデストラクタの関係を教えてください。 try-catchでメモリ確保を含むクラスをスローした場合、デストラクタはどの時点で働くのか、教えてください。たとえば、↓の使いかたは大丈夫でしょうか? 【1】 try{ throw(cerror(100, "エラー情報")); }catch(cerror& err){ //ここでerrを参照しても問題ないのでしょうか? } 【2】 try{ cerror err(100, "エラー情報"); throw(err); // (1) }catch(cerror& err){ //ここでerrを参照しても問題ないのでしょうか? //まだデストラクタはちゃんと動作するのでしょうか? //catchが呼び出し元のメンバであったりしても大丈夫なのでしょうか? } 宜しくお願いします。
回答: throw test(); で生成と同時に例外を投げると、 コピーコンストラクタが呼ばれないように見えますね。 ----------- 使用したコード --------- struct test { // 省略 }; int main() { try { cerr << "throw!" << endl; throw test(); } catch (test const& test) { cerr << "catch!" << endl; } return 0; } ---------- 実行した結果 ------------- $ ./test throw! test::test() catch! test::~test() ---------- 環境 --------------------- freebsd 6.3-release-p2 g++ 3.4.6 ------------------------------------- throw test(); の箇所を test test; throw test; にすると、try ブロックで test がコピーされた後に破棄されますが。 環境依存なのかなあ?