FreeGLUT を使用してコンソール アプリケーションを閉じるのに本当に問題があります。
メモリリークが発生したくないので、可能な限りすべてのクロージングを行う最善の方法を知りたいです(私はそれらをかなり恐れています)。
だから私はすでに次のことを試しましたが、これは私にこのような例外を与えています:
myProject.exe の 0x754e6a6f で初回例外: 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++ にあります。
アップデート
デバッグ中のため、例外がスローされることがわかりました。それで問題ないでしょう。しかし、問題は未解決です:実際に過剰摂取を解消する最もエレガントな方法は何ですか?
atexit()
こちらも使えそうなので、使ってみようかな?