我有一个 DirectX 应用程序。这很简单,但我有一个问题。我创建了设备、设备上下文等,一切正常,但当我退出时,发生了崩溃,错误是:HEAP: Free Heap block 3ad7d18 modified at 3ad7d98 after it was freed
。仅当我至少调用一次 IDXGISwapChain Present
函数时才会发生。如果我不这样做,那么整个清洁过程就会顺利进行。此外,我在每个 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 现在什么都不做,绘制场景只调用这两个函数:
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; } }
最佳答案
好吧...那真的很烦人。这段代码似乎不错,问题出在驱动程序或其他地方。当我安装新的驱动程序并重新启动 PC 两次后,问题就消失了。
关于c++ - 清理 DirectX 应用程序时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16798890/