Каковы возможные последствия неизбежного вызова abort()?
В прерванном порядке мы имеем
Деструкторы переменных с автоматическим, локальным и статическим продолжительностью хранения не вызываются. Функции, переданные в std::atexit(), также не вызываются. Закрыты ли открытые ресурсы, такие как файлы, определяется реализацией.
Я немного запутался в терминологии и противоречии термина прерывания, который "закрывает" мою программу, и из описания той функции, в которой говорится, что деструкторы и открытые ресурсы, возможно, не вызываются / закрываются соответственно. Итак, возможно ли, что моя программа продолжает работать, и у нее есть некоторая утечка памяти или ресурсы, все еще открытые после вызова abort()?
3 ответа
Это как убить человека. У них не будет возможности оплатить какие-либо неоплаченные счета, организовать свое наследие, убрать квартиру и т. Д.
Произойдет ли что-либо из этого, зависит от их родственников или других третьих лиц.
Таким образом, обычно такие вещи, как открытые файлы, закрываются, и не происходит утечка памяти, потому что об этом позаботится ОС (например, когда полиция или около того освободит квартиру). Есть некоторые платформы, где этого не произойдет, например, 16-битные окна или встроенные системы, но в современных системах Windows или Linux это будет хорошо.
Однако, что определенно не произойдет, так это то, что деструкторы работают. Это как если бы человек, которого нужно убить, записал последнюю запись в свой дневник и запечатал ее или что-то в этом роде - только сам человек знает, как это сделать, и не может, когда вы убиваете их без предупреждения. Так что, если в деструкторе должно было произойти что-то важное, это может быть проблематично, но обычно не так драматично - это может быть что-то вроде того, что программа создала где-то временный файл и обычно удаляет его при выходе, а теперь это не может и файл остается.
Тем не менее, ваша программа будет закрыта и больше не работает. У него просто не будет возможности очистить вещи, и поэтому он зависит от операционной системы, которая делает правильные вещи и очищает используемые им ресурсы.
Функции, переданные в std::atexit(), также не вызываются. Закрыты ли открытые ресурсы, такие как файлы, определяется реализацией.
Это означает, что реализация должна решить, что произойдет. В любой обычной потребительской операционной системе большинство объектов, связанных с вашим процессом, уничтожаются при выходе из процесса. Это означает, что вы не потеряете память, выделенную new
Например, или открыть файлы.
Могут быть необычные виды объектов, которые не освобождаются - например, если у вас есть блок с общей памятью, он может остаться, если другой процесс попытается получить к нему доступ. Или, если вы создали временный файл, намереваясь удалить его позже, теперь файл останется там, потому что ваша программа не собирается его удалять.
В Unix вызов abort() эффективно доставляет сигнал SIGABRT вашему процессу. Поведение ядра по умолчанию при доставке этого сигнала - закрытие вашего процесса, возможно, оставление файла ядра и закрытие любых дескрипторов. Поток контроля вашего процесса полностью удален. Обратите внимание, что все это происходит вне какого-либо понятия C++ (или любого другого языка). Вот почему это считается реализацией определенной.
Если вы хотите изменить поведение по умолчанию, вам нужно установить обработчик сигнала, чтобы поймать SIGABRT.