gpt4 book ai didi

c++ - 清理 DirectX 应用程序时崩溃

转载 作者:太空狗 更新时间:2023-10-29 21:24:11 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com