Выходит ли из (0) какие-либо проблемы в MFC? - PullRequest
2 голосов
/ 25 февраля 2011

Я хочу немедленно выйти из приложения MFC на C ++.Является ли выход (0) лучшим решением?например.это препятствует тому, чтобы деструкторы были вызваны, это потокобезопасно?и т.д. Есть ли лучшее решение?Спасибо.

Ответы [ 5 ]

6 голосов
/ 25 февраля 2011

Да, exit(0) - лучшее решение.Это приведет к запуску деструкторов глобальных объектов (и static объектов внутри функций), однако не приведет к запуску деструкторов объектов, выделенных в стеке или в куче:

// At global scope
ClassWithDestruct globalObject;

void SomeFunction()
{
    static ClassWithDestructor staticObject;
    ClassWithDestructor stackObject;
    ClassWithDestructor *heapObject = new ClassWithDestructor;

    // On the following call to exit(), the destructors of 'globalObject' and
    // 'staticObject' will run, but those of 'stackObject' and 'heapObject' will
    // NOT run
    exit(0);
}

или нет, это потокобезопасно, на этот вопрос сложно ответить: вам не следует одновременно звонить по номеру exit из нескольких потоков, вы должны вызывать его только один раз.Если какие-либо деструкторы запускаются в результате выполнения exit или любой другой функции, зарегистрированной в atexit, то очевидно, что эти функции должны быть поточно-ориентированными, если имеют дело с данными, которые потенциально могут быть использованыдругими потоками.

Если ваша программа выходит нормально (скажем, в результате запроса пользователя на выход), вам следует либо вызвать exit, либо вернуться из main / WinMain, чтоэквивалентно звонку exit.Если ваша программа завершает работу ненормально (скажем, в результате нарушения доступа или неудачного подтверждения), вам следует позвонить либо _exit, либо abort, что не вызывает деструкторов.

2 голосов
/ 26 февраля 2011

Если вы хотите немедленно выйти из , что исключает возможность запуска любых деструкторов и тому подобного заранее, тогда вы, вероятно, захотите вызвать abort(). Если вы do хотите, чтобы деструкторы выполнялись, вы, вероятно, захотите использовать PostQuitMessage(0);. В любом случае, exit(), вероятно, неправильный выбор.

1 голос
/ 25 февраля 2011

, когда процесс win32 выходит из любого ресурса, связанного с ним, очищается ОС, поэтому для меня это совершенно нормально.

0 голосов
/ 26 февраля 2011

Нет, это не безопасный способ завершить вашу программу.Данные статического хранения и нелокальные автоматические объекты будут разрушаться, но локальные автоматические объекты не будут.

Начиная с 18.3 / 8 в стандарте C ++:

Функция exit() имеетдополнительное поведение в этом международном стандарте:

  • Во-первых, объекты со статической продолжительностью хранения уничтожаются и вызываются функции, зарегистрированные с помощью вызова atexit.Нелокальные объекты со статической продолжительностью хранения уничтожаются […].(Автоматические объекты не уничтожаются в результате вызова exit().) [207]) […] Локальный статический объект obj3 уничтожается в то же время, как если бы была зарегистрирована функция, вызывающая деструктор obj3atexit при завершении конструктора obj3.

  • Далее все открытые потоки C (как опосредовано сигнатурами функций, объявленными в <cstdio>) с неписанными буферизованными даннымиочищены, все открытые потоки C закрыты, и все файлы, созданные с помощью вызова tmpfile(), удалены. [209])

[207]: все объекты с автоматическим хранением уничтожаются впрограмма, функция которой main() не содержит автоматических объектов и выполняет вызов exit().Элемент управления можно напрямую передать в такой main(), создав исключение, которое перехватывается в main().

[209]: любые потоки C, связанные с cin, cout и т. Д. (27.3)сбрасываются и закрываются, когда статические объекты уничтожаются на предыдущем этапе.Функция tmpfile() объявлена ​​в <cstdio>.


В соответствующей заметке std::exit(EXIT_SUCCESS) вводит в заблуждение.

0 голосов
/ 25 февраля 2011

exit (0) выходит из процесса. Вся память очищена. С другой стороны, явно управляемые ресурсы не могут быть закрыты. Конечно, дескрипторы файлов будут закрыты, а содержимое в буферах Windows будет сброшено. Однако вещи, которыми управляет приложение, не будут.

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