ScreenShot # 1: Sample (Образец &) {...) // Нет ошибки без использования "сопзЬ" ScreenShot # 2: Деструктор вызывается дважды, когда копия-конструктор не включено. Конструкторы ведут себя странно с кодом обработки исключений
Когда я запускаю этот код в VC++ 2010, я нашел результаты surprizing, пожалуйста, посмотрите:
#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;
}
Пожалуйста скажите, почему не включая копировать-конструктор в примере, деструктор вызывается дважды , И поэтому вызывает Abort(), если мы, например, освобождаем кучу в деструкторе.
Также я знаю, что экземпляр объекта создается из объекта метания, но почему он не вызывает для него экземпляр-конструктор.
См. Прилагаемый скриншот для кода и вывода.
Во-первых, это должен быть 'class Sample {' not 'class Sample() {'. – 2013-03-11 04:45:14
Кроме того, конструктор копирования должен взять ссылку на const, или вы получите ошибку компилятора. – 2013-03-11 04:48:00
Можете ли вы показать нам свой реальный код? Когда я компилирую и запускаю это, я вижу только «Sample() - Caught_Sample - ~ Sample -'. (с конструктором копирования и без него) – Xymostech