この dtor/ctor の順序は正常ですか? もしそうなら、それはなぜですか?
次の単純な関数では
TemporaryObject SimpleFunction();
{
TemporaryObject obj = MakeObj();
// ...
return obj; // Stepping through at this point we hit TemporaryObject::dtor, MyObject::ctor
}
// At call site
MyObject obj = SimpleFunction();
return ステートメントで、MyObject ctor が呼び出され、次に TemporaryObject dtor が呼び出されることを期待します。(TemporaryObject が最初にコピーされる可能性がありますが、ここでは RVO が一般的です)。
VS2010 (デバッグ ビルド) では、TemporaryObject dtor が最初に呼び出され、次に MyObject コンストラクターが破棄されたオブジェクトで呼び出されます。メモリアドレスを見ると、それが破壊されたオブジェクトが渡されていることが確認されます。疑いがある場合は、デストラクタの副作用は明らかです。
(完全を期すために、MyObject ctor は、TemporaryObject フラグがコピーされたことを示すフラグを設定します。TemporaryObject dtor は、このフラグが設定されていることをアサートします。この場合、「コピー」の前に破壊が発生していることに気付きました)。