У меня действительно проблемы с закрытием консольного приложения с помощью FreeGLUT.
Я хотел бы знать, как лучше всего делать все возможное закрытие, потому что я не хочу никаких утечек памяти (я их очень боюсь).
Итак, я уже попробовал следующее, что дает мне исключение, подобное этому:
Исключение первого шанса в 0x754e6a6f в myProject.exe: 0x40010005: Control-C.
int main(int argc, char **argv)
{
if( SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, true) )
{
// more code here as well ....
glutCloseFunc(close); // set the window closing function of opengl
glutMainLoop();
close(); // close function if coming here somehow
}
else
{
return 1;
}
return 0;
}
void close()
{
// keyboardManager is a pointer to a class
// which I want to delete, so no memory will leak.
if(keyboardManager) // do I need this check?
delete keyboardManager;
}
bool CtrlHandler(DWORD fdwCtrlType)
{
switch(fdwCtrlType)
{
// Handle the CTRL-C signal.
case CTRL_C_EVENT:
// and the close button
case CTRL_CLOSE_EVENT:
close();
return true;
// Pass other signals to the next handler.
case CTRL_BREAK_EVENT:
return false;
// delete the pointer anyway
case CTRL_LOGOFF_EVENT:
case CTRL_SHUTDOWN_EVENT:
default:
close();
return false;
}
}
Итак, что идет правильно:
- Закрытие окна перенасыщения
- Закрытие консольного приложения с помощью
x
- Закрытие моего окна перенасыщения с помощью моего клавишного менеджера
if(keyboardManager->isKeyDown[27]) glutExit();
Что идет не так:
- Закрытие консольного приложения с помощью комбинации клавиш CTRL + C дает исключение сверху.
Это в Visual Studio 2008 C ++.
UPDATE
Я обнаружил, что исключение выдается, потому что я нахожусь в отладке. Так что это не будет проблемой. Но вопрос все еще открыт: Какой самый элегантный способ на самом деле закрыть перенасыщение?
atexit()
, кажется, тоже работает, так что, может быть, я могу использовать это?