清理DirectX应用程序时崩溃
Crash while cleaning DirectX application
我有一个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)。
My message loop function:
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; } }
Ok…这真的很烦人。这段代码似乎很好,问题是在驱动程序或其他。当我安装新驱动程序并重启PC两次时,问题消失了。
值得的是,这就是我如何修复完全相同的问题。在渲染代码中仅发生Clear()
,并且仅当D3D11_CREATE_DEVICE_DEBUG
在上时(为了增加神秘感):
case WM_CLOSE: // X clicked or Alt+F4
::DestroyWindow(hWnd); // triggers WM_DESTROY
break;
case WM_DESTROY:
gD3d11Context->ClearState();
PostQuitMessage(0); // this triggers the WM_QUIT to break the loop
break;
加上我有我的指针包装在一个自定义的ComPtr
实现。它们是类的成员,并以相反的构造顺序自毁。所以没有->Release()
堆栈:)
相关文章:
- 使用调试/崩溃报告将应用程序部署到客户端
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 如何找出应用程序崩溃的原因 - Win 10 LTSB
- 操纵安卓相机的深度图导致应用程序崩溃
- 为什么从文件获取图标时应用程序有时会崩溃?
- 在 Ubuntu 服务器上运行 QT 应用程序时崩溃
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- Qt应用程序找不到第三方DLL并崩溃
- 由于____chkstk_darwin,在Catalina上使用部署10.10编译的MacOS应用程序在HighSierra版本<崩溃
- QCompleter set模型使应用程序崩溃
- Qt 5 应用程序崩溃并出现"qLineEdit::setText"
- 切换NvAPI_Stereo_Deactivate/NvAPI_Stereo_activate会使unity应用程序崩溃
- Opencv在2013年第5季度不起作用.应用程序总是在窗口中崩溃
- eglSwapBuffers上的应用程序崩溃
- C 多线程崩溃应用程序
- 加载的 obj 模型闪烁并崩溃应用程序
- strcats func 崩溃应用程序
- 生成的Protobuf代码崩溃应用程序
- C++字符串::查找崩溃应用程序
- av_free随机崩溃应用程序-FFMPEG C++