Выключит() или исключение, чтобы исключить вызов деструктора конца области?

Скажем, у меня есть следующий код:

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() гарантирует, что все исключения пойманы, и вызывается все деструкторы.