Я наткнулся на следующий фрагмент кода:
#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) или этой конкретной программой.
Является ли текст просто ошибочным по поводу ошибки во время выполнения?Или это действительно распространенная ошибка?Или, может быть, мой компилятор реализовал какой-то механизм защиты от подобных вещей?