Я наткнулся на следующий фрагмент кода:
#include <iostream>
#include <string>
using namespace std;
class First
{
string *s;
public:
First() { s = new string("Text");}
~First() { delete s;}
void Print(){ cout<<*s;}
};
int main()
{
First FirstObject;
FirstObject.Print();
FirstObject.~First();
}
В тексте говорилось, что этот фрагмент должен вызвать ошибку времени выполнения. Я не был в этом уверен, поэтому попытался скомпилировать и запустить его. Это сработало. Странно то, что, несмотря на простоту задействованных данных, программа заикалась после печати «Текст» и завершилась только через одну секунду.
Я добавил строку для печати в деструктор, так как не был уверен, что можно явно вызывать такой деструктор. Программа напечатала двойную строку. Поэтому я предположил, что деструктор вызывается дважды, так как обычное завершение программы не знает о явном вызове и пытается снова уничтожить объект.
Простой поиск подтвердил, что явный вызов деструктора для автоматизированного объекта опасен, так как второй вызов (когда объект выходит за пределы области видимости) имеет неопределенное поведение. Так что мне повезло с моим компилятором (VS 2017) или с этой конкретной программой.
Текст просто неверен об ошибке времени выполнения? Или действительно часто возникает ошибка времени выполнения? Или, может быть, мой компилятор реализовал какой-то механизм защиты от подобных вещей?
noexcept
, является гарантированным вызовомstd::terminate
, который я бы классифицировал как ошибку времени выполнения. - person chris   schedule 12.11.2018s
, а не о самом объекте. Виноват. - person Mark Ransom   schedule 20.11.2018