2016-04-26 3 views
2

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

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

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

+0

Не может быть точным обманом, но может помочь понять: http://stackoverflow.com/questions/397075/what-is-the-difference-between-exit-and-abort – Tas

+1

Программа не может оба прерывать и остаются бегущими, это противоречие. Поскольку он не существует после его прерывания, он также не может утечки памяти - это актуально во время выполнения. Возможно, что другие внешние ресурсы не очищаются должным образом (например, временные файлы и т. Д.). –

+0

@ DanMašek: re «Так как он не существует после его прерывания, он также не может пропускать память», нет связи от предпосылки к заключению, извините. Все еще с современными ОС для общих компьютеров, память, как правило, исправлена. –

ответ

2

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

Независимо от того, происходит ли это из-за их родственников или третьих лиц.

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

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

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

+0

Черт, этот ответ прояснил мне все ... Другие тоже. Спасибо за все! –

4

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

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

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

2

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

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

+1

Это технически самый тщательный ответ. – CherryDT