清理directx,正确释放com引用

时间:2011-06-09 20:48:05

标签: com directx

我只是在学习directx。一个人通常通过函数调用(如

)创建一个directx设备和几个其他COM接口
ID3D11CreateDeviceAndSwapChain(.... ,& device, ...);

在我看过的所有教程代码中,com接口都是使用类似于

的东西发布的
if (pointer_to_com_object) {
    pointer_to_com_object->Release(); 
    pointer_to_com_object = 0;
}

e.g。以下内容摘自Microsoft的directx 11教程中的Tutorial07_2008。

if( g_pSamplerLinear ) g_pSamplerLinear->Release();
if( g_pTextureRV ) g_pTextureRV->Release();
if( g_pCBNeverChanges ) g_pCBNeverChanges->Release();
if( g_pCBChangeOnResize ) g_pCBChangeOnResize->Release();
if( g_pCBChangesEveryFrame ) g_pCBChangesEveryFrame->Release();
if( g_pVertexBuffer ) g_pVertexBuffer->Release();
if( g_pIndexBuffer ) g_pIndexBuffer->Release();
if( g_pVertexLayout ) g_pVertexLayout->Release();
if( g_pVertexShader ) g_pVertexShader->Release();
if( g_pPixelShader ) g_pPixelShader->Release();
if( g_pDepthStencil ) g_pDepthStencil->Release();
if( g_pDepthStencilView ) g_pDepthStencilView->Release();
if( g_pRenderTargetView ) g_pRenderTargetView->Release();
if( g_pSwapChain ) g_pSwapChain->Release();
if( g_pImmediateContext ) g_pImmediateContext->Release();
if( g_pd3dDevice ) g_pd3dDevice->Release();

正如在answers to this question中指出的那样,COM对象可以引用你不拥有的对象。

上面是一个清理directx的坏方法,还是Directx COM对象永远不会引用你没有创建的对象?

我只是问,因为我在学习的过程中一直这样做。

1 个答案:

答案 0 :(得分:4)

COM对象被引用计数。当您调用Release()时,您实际上会减少内部引用计数。如果另一个对象仍然拥有引用,它将不会被销毁。

如果应用程序的某些其他部分最终对COM对象有新的引用,请确保在完成后调用Release()。仔细阅读返回引用的方法的文档,知道是否必须调用Release()。通常你必须这样做。

例如在IDirect3DTexture9::GetSurfaceLevel文档中:

  

调用此方法会增加   内部参考计数   IDirect3DSurface9接口。失败   在何时调用IUnknown :: Release   使用此IDirect3DSurface9完成   接口导致内存泄漏。