3

DirectX アプリケーションがあります。それは非常に単純ですが、私はそれに問題があります。デバイス、デバイス コンテキストなどを作成し、すべてが機能していますが、終了するとクラッシュが発生し、次のエラーが表示されますHEAP: Free Heap block 3ad7d18 modified at 3ad7d98 after it was freedIDXGISwapChain Present関数を少なくとも1回呼び出した場合にのみ発生します。そうしないと、クリーニングプロセス全体がうまくいきます。さらに、すべての COM オブジェクトを呼び出すReleaseと、クラッシュは常に最後の COM オブジェクトを解放したときにのみ発生します (順序は関係ありません)。Windows 7、MS Visual 2012 で DirectX 11 (Win8 SDK) を使用しています。

私のメッセージループ機能:

int Engine::run( ){

    MSG msg = { 0 };
    mTimeCounter->restart( ); // doesn't matter
    while( msg.message != WM_QUIT ){ 
        if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ){
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        } else {
            updateScene( mTimeCounter->deltaTime( ) );
            drawScene( );  
        }  
    }

    return static_cast<int>( msg.wParam );
}

updateScene は今は何もせず、シーンを描画するだけで次の 2 つの関数を呼び出します。

void Engine::sceneBegin( ){
    static FLOAT color[] = { 0.05f, 0.15f, 0.05f, 1.0f }; 
    mDeviceContext->ClearRenderTargetView( mBackBufferView, color );
    mDeviceContext->ClearDepthStencilView( mDepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1, 0 );
}


void Engine::sceneEnd( ){
    mSwapChain->Present( 0, 0 ); // crash do not occure if i comment this line of code
}

メッセージスイッチの一部:

   case WM_QUIT : // i do not receive it even once because i press window's X button and it destroy window before i could receive WM_QUIT ( or not? :P )
    {

                DestroyWindow( mMainWnd );
            }
            break;

            case WM_DESTROY : // i receive it if press window's X button
            {
                PostQuitMessage( 0 ); 
            }  
            break;
return DefWindowProc( hWnd, msg, wParam, lParam );

エンジンを初期化して起動する主な機能:

EngTest *eng = new EngTest( );
eng->initialize( hInstance, L"Hi", show );
int r = eng->run( );
delete eng; // crash occures here but only if i call Present at least once.

シャットダウン:

// called in Engine's destructor
void Engine::shutdown( ){ 
    RELEASE_COM( mDepthStencilView );
    RELEASE_COM( mDepthStencilBuffer );
    RELEASE_COM( mBackBufferView );
    RELEASE_COM( mSwapChain );
    if( mDeviceContext )
        mDeviceContext->ClearState( );
    RELEASE_COM( mDeviceContext );
    RELEASE_COM( mDevice );  
}

RELEASE_COM

#define RELEASE_COM( x ) { if( x != NULL ) { x->Release( ); x = NULL; } }
4

2 に答える 2