Предотвратит ли exit() или исключение вызов деструктора конца области видимости?

Допустим, у меня есть следующий код:

struct mytype
{
    ~mytype() { /* do something like call Mix_CloseAudio etc */ }
};

int main()
{
    mytype instant;

    init_stuff();

    start();

    return 0;
}

Гарантированно ли вызывается этот деструктор, даже если exit() используется где-то внутри start()?


person Truncheon    schedule 19.04.2010    source источник
comment
исключения вызовут деструктор, exit() нет.   -  person falstro    schedule 19.04.2010
comment
Не совсем в этом случае, но у меня вызывались деструкторы для статических объектов в Linux с GCC.   -  person Pavel Šimerda    schedule 19.05.2015


Ответы (3)


Если вы вызовете exit, деструктор не будет вызван.

Из стандарта С++ (§3.6.1/4):

Вызов функции

void exit(int);

объявленный в <cstdlib> (18.3), завершает программу, не выходя из текущего блока и, следовательно, не уничтожая какие-либо объекты с автоматической продолжительностью хранения (12.4). Если выход вызывается для завершения программы во время уничтожения объекта со статической продолжительностью хранения, программа имеет неопределенное поведение.

person James McNellis    schedule 19.04.2010
comment
Но можно ли выйти и вызвать деструкторы? - person Victor; 27.07.2019

Да, вызов exit() означает, что деструктор вызываться не будет:

Вызов функции void exit(int); объявленный в <cstdlib> (18.3), завершает программу, не выходя из текущего блока и, следовательно, не уничтожая какие-либо объекты с автоматической продолжительностью хранения (12.4). Если выход вызывается для завершения программы во время уничтожения объекта со статической продолжительностью хранения, программа имеет неопределенное поведение.

С другой стороны, если возникнет исключение, будет вызван деструктор. Это основа безопасности исключений в C++.

person Community    schedule 19.04.2010

Исключения будут вызывать деструкторы, пока что-то в программе перехватывает исключение. Если исключение выходит из функции main(), не будучи перехваченным, стандарт не требует, чтобы среда выполнения раскручивала стек для очистки.

Используя

try{
  // code
}catch(...){ //that elipsis should actually appear in your code
             //it doesn't mean I omitted code here.
  //code
}

в вашей функции main() гарантирует, что каждое исключение будет перехвачено, и будут вызваны все деструкторы.

person Ken Bloom    schedule 19.04.2010