我只是在学习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对象永远不会引用你没有创建的对象?
我只是问,因为我在学习的过程中一直这样做。
答案 0 :(得分:4)
COM对象被引用计数。当您调用Release()
时,您实际上会减少内部引用计数。如果另一个对象仍然拥有引用,它将不会被销毁。
如果应用程序的某些其他部分最终对COM对象有新的引用,请确保在完成后调用Release()
。仔细阅读返回引用的方法的文档,知道是否必须调用Release()
。通常你必须这样做。
例如在IDirect3DTexture9::GetSurfaceLevel文档中:
调用此方法会增加 内部参考计数 IDirect3DSurface9接口。失败 在何时调用IUnknown :: Release 使用此IDirect3DSurface9完成 接口导致内存泄漏。