Каковы возможные последствия неизбежного вызова abort()?

В прерванном порядке мы имеем

Деструкторы переменных с автоматическим, локальным и статическим продолжительностью хранения не вызываются. Функции, переданные в std::atexit(), также не вызываются. Закрыты ли открытые ресурсы, такие как файлы, определяется реализацией.

Я немного запутался в терминологии и противоречии термина прерывания, который "закрывает" мою программу, и из описания той функции, в которой говорится, что деструкторы и открытые ресурсы, возможно, не вызываются / закрываются соответственно. Итак, возможно ли, что моя программа продолжает работать, и у нее есть некоторая утечка памяти или ресурсы, все еще открытые после вызова abort()?

3 ответа

Решение

Это как убить человека. У них не будет возможности оплатить какие-либо неоплаченные счета, организовать свое наследие, убрать квартиру и т. Д.

Произойдет ли что-либо из этого, зависит от их родственников или других третьих лиц.

Таким образом, обычно такие вещи, как открытые файлы, закрываются, и не происходит утечка памяти, потому что об этом позаботится ОС (например, когда полиция или около того освободит квартиру). Есть некоторые платформы, где этого не произойдет, например, 16-битные окна или встроенные системы, но в современных системах Windows или Linux это будет хорошо.

Однако, что определенно не произойдет, так это то, что деструкторы работают. Это как если бы человек, которого нужно убить, записал последнюю запись в свой дневник и запечатал ее или что-то в этом роде - только сам человек знает, как это сделать, и не может, когда вы убиваете их без предупреждения. Так что, если в деструкторе должно было произойти что-то важное, это может быть проблематично, но обычно не так драматично - это может быть что-то вроде того, что программа создала где-то временный файл и обычно удаляет его при выходе, а теперь это не может и файл остается.

Тем не менее, ваша программа будет закрыта и больше не работает. У него просто не будет возможности очистить вещи, и поэтому он зависит от операционной системы, которая делает правильные вещи и очищает используемые им ресурсы.

Функции, переданные в std::atexit(), также не вызываются. Закрыты ли открытые ресурсы, такие как файлы, определяется реализацией.

Это означает, что реализация должна решить, что произойдет. В любой обычной потребительской операционной системе большинство объектов, связанных с вашим процессом, уничтожаются при выходе из процесса. Это означает, что вы не потеряете память, выделенную newНапример, или открыть файлы.

Могут быть необычные виды объектов, которые не освобождаются - например, если у вас есть блок с общей памятью, он может остаться, если другой процесс попытается получить к нему доступ. Или, если вы создали временный файл, намереваясь удалить его позже, теперь файл останется там, потому что ваша программа не собирается его удалять.

В Unix вызов abort() эффективно доставляет сигнал SIGABRT вашему процессу. Поведение ядра по умолчанию при доставке этого сигнала - закрытие вашего процесса, возможно, оставление файла ядра и закрытие любых дескрипторов. Поток контроля вашего процесса полностью удален. Обратите внимание, что все это происходит вне какого-либо понятия C++ (или любого другого языка). Вот почему это считается реализацией определенной.

Если вы хотите изменить поведение по умолчанию, вам нужно установить обработчик сигнала, чтобы поймать SIGABRT.

Другие вопросы по тегам