Выключит() или исключение, чтобы исключить вызов деструктора конца области?
Скажем, у меня есть следующий код:
struct mytype
{
~mytype() { /* do something like call Mix_CloseAudio etc */ }
};
int main()
{
mytype instant;
init_stuff();
start();
return 0;
}
Является ли этот деструктор гарантированно вызываться, даже если exit() используется где-то внутри start()?
Ответы
Ответ 1
Если вы вызываете exit
, деструктор не будет вызываться.
Из стандарта С++ (§3.6.1/4):
Вызов функции
void exit(int);
объявленный в <cstdlib>
(18.3), завершает программу, не покидая текущий блок и, следовательно, не уничтожая никаких объектов с автоматическим временем хранения (12.4). Если вызывается вызов для завершения программы во время уничтожения объекта со статической продолжительностью хранения, программа имеет поведение undefined.
Ответ 2
Да, вызов exit() означает, что деструктор не будет вызываться:
Вызов функции void exit (int); объявленный в <cstdlib>
(18.3) завершает программу, не покидая текущий блок и, следовательно, без уничтожение любых объектов с помощью автоматического время хранения (12.4). Если выход для завершения программы во время разрушение объекта со статическим продолжительности хранения, программа undefined.
Если вызывается исключение, с другой стороны, будет вызван деструктор. Это основа безопасности исключений в С++.
Ответ 3
Исключения будут вызывать деструкторы, если что-то в программе ловит исключение. Если исключение выходит из функции main(), не будучи пойманным, стандарт не требует, чтобы среда выполнения удаляла стек для очистки.
Используя
try{
// code
}catch(...){ //that elipsis should actually appear in your code
//it doesn't mean I omitted code here.
//code
}
в вашей функции main()
гарантирует, что все исключения пойманы, и вызывается все деструкторы.