2017-02-18 60 views
0

У меня есть программа MFC C++, которая изредка врезается на выход ошибки без видимых причин. Мой конкретный запрос:Неверный выход программы: MFC C++

В моей перегрузке InitInstance() существуют различные проверки, а также настройка ресурсов, таких как события и семафоры. Когда пользователь запросит нормальный выход, есть обработчик сообщения OnDestroy(), который закрывает все, включая освобождение ресурсов и т. Д. Этот бит работает нормально.

Проблема возникает, когда одна из проверок в InitInstance() терпит неудачу, и функция возвращает значение 0 (вызывая выход программы). Мой вопрос заключается в следующем: в этом случае OnDestroy() автоматически вызывается для очистки вещей, или мне нужно запустить его непосредственно перед выходом из InitInstance?

+0

Почему бы вам не спросить своего отладчика? Установите контрольную точку в 'OnDestroy()' и посмотрите, что произойдет. Кроме того, процесс не сбой * «без видимых причин» *. Причина становится очевидной, когда вы настраиваете отладчик на разрыв, когда возникает исключение Win32. Не будь беспомощным. – IInspectable

+0

Любая нить или мьютекс в вашей программе, которая выделяет основную программу? Они должны быть закрыты после основных выходов, но есть ошибка MSVC, которая должна быть исправлена ​​вручную. – ark1974

+1

@ ark1974: Когда элемент управления покидает предоставленную пользователем точку входа (она называется 'WinMain' в программе GUI, а не' main'), это в основном не имеет значения, выполняется ли очистка или нет. Процесс вот-вот завершится, и ОС все равно вернет все ресурсы. Не уверен, к какой * "ошибке" * вы имеете в виду. – IInspectable

ответ

0

Если окно основного окна уже существует, вы должны его уничтожить раньше, используя DestroyWindow. И нет, он не будет автоматически уничтожен, когда InitInstance выходит с FALSE. ExitInstance выполняется, но существующие окна будут закрыты при выходе приложения.

В любом случае нормальные ресурсы, такие как файлы и память, освобождаются, когда приложение существует.