У меня действительно проблемы с закрытием консольного приложения с помощью 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 С++.
ОБНОВИТЬ
Я обнаружил, что возникает исключение, потому что я в отладке. Так что это не будет проблемой. Но вопрос все еще остается открытым: Какой самый элегантный способ действительно закрыть перенасыщение?
atexit()
тоже работает, так что, может быть, я могу использовать это?
atexit()
скорее всего не решит вашу проблему с очисткой объектов C++. - person wilhelmtell   schedule 18.02.2011