Будет ли exit () или исключение препятствовать вызову деструктора конца области видимости? - PullRequest
19 голосов
/ 19 апреля 2010

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

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

int main()
{
    mytype instant;

    init_stuff();

    start();

    return 0;
}

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

Ответы [ 3 ]

23 голосов
/ 19 апреля 2010

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

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

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

void exit(int);

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

17 голосов
/ 19 апреля 2010

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

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

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

3 голосов
/ 19 апреля 2010

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

Использование

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

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

...