スクリーンショット #1: Sample(Sample&) {...) // "const" を使用せずにエラーなし スクリーンショット #2: copy-constructor が含まれていない場合、デストラクタが 2 回呼び出されます。
このコードを VC++2010 で実行すると、驚くべき結果が得られました。
#include <iostream>
using namespace std;
class Sample {
public:
Sample() { cout<<"Sample().\n"; }
// Sample (Sample&) { cout<<"Sample(Sample&).\n"; }
~Sample() { cout<<"~Sample().\n"; }
};
void fx() {
throw Sample();
}
int _tmain(int argc, _TCHAR* argv[])
{
try { fx(); }
catch (Sample&) { cout<<"Caught Sample.\n"; }
return 0;
}
例にコピーコンストラクタを含めずに、デストラクタが2回呼び出されている理由を教えてください。たとえば、デストラクタでヒープを解放している場合、そうすると Abort() が発生します。
また、オブジェクトのコピーがスローされたオブジェクトから作成されることも知っていますが、そのためにコピーコンストラクターを呼び出さないのはなぜですか。
コードと出力については、添付のスクリーン ショットを参照してください。