11

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; 
    } 
}

したがって、正しいのは次のとおりです。

  1. 過剰摂取の窓を閉める
  2. でコンソール アプリケーションを閉じるx
  3. キーボードマネージャーで過剰摂取のウィンドウを閉じるif(keyboardManager->isKeyDown[27]) glutExit();

うまくいかないのは次のとおりです。

  1. CTRL+C でコンソール アプリケーションを閉じると、上記の例外が発生します。

これは Visual Studio 2008 C++ にあります。

アップデート

デバッグ中のため、例外がスローされることがわかりました。それで問題ないでしょう。しかし、問題は未解決です:実際に過剰摂取を解消する最もエレガントな方法は何ですか?

atexit()こちらも使えそうなので、使ってみようかな?

4

4 に答える 4

16

私はこの関数を使用します:

void glutLeaveMainLoop ( void ); 

彼らのsourceforgeページにもっと多くの情報がありますが、私はその機能を使ったことがありません:

glutLeaveMainLoop関数により、freeglutはイベントループを停止します。GLUT_ACTION_ON_WINDOW_CLOSEオプションがGLUT_ACTION_CONTINUE_EXECUTIONに設定されている場合、制御はglutMainLoopを呼び出した関数に戻ります。それ以外の場合、アプリケーションは終了します。

http://freeglut.sourceforge.net/docs/api.php#EventProcessing

deleteヌルポインタで安全に使用でき、チェックする必要はありません。

于 2011-02-21T00:51:45.983 に答える
5

Maarten の投稿のおかげで、これは私にはうまくいきます:

glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_CONTINUE_EXECUTION);

アプリケーションを終了せずにメインループを離れたいときはいつでも:

glutLeaveMainLoop();

「freeglut.h」を含めることを忘れないでください

于 2016-09-29T14:18:30.737 に答える
0

この方法を試してください:

glutDestroyWindow(glutGetWindow());
于 2018-10-01T08:21:23.433 に答える