清理directx,正确释放com引用

清理directx,正确释放com引用,com,directx,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.以下内容摘自微

我正在学习directx。通常,可以通过函数调用创建directx设备和其他几个COM接口,例如

ID3D11CreateDeviceAndSwapChain(.... ,& device, ...);
在我看到的所有教程代码中,com接口都是使用类似于

if (pointer_to_com_object) {
    pointer_to_com_object->Release(); 
    pointer_to_com_object = 0;
}
e、 g.以下内容摘自微软directx 11教程中的教程07_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();
正如COM中指出的,对象可以有对它们的引用,而这些引用不是您自己的

那么,以上是清理directx的一种糟糕方法,还是directx COM对象从来没有引用过您未创建的对象


我之所以这么问,是因为在我学习的过程中,我一直看到它是以这种方式完成的。

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

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

例如,在文档中:

调用此方法将增加 上的内部引用计数 IDirect3DSurface9接口。失败 调用IUnknown::在 已完成此IDirect3DSurface9的使用 接口导致内存泄漏


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

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

例如,在文档中:

调用此方法将增加 上的内部引用计数 IDirect3DSurface9接口。失败 调用IUnknown::在 已完成此IDirect3DSurface9的使用 接口导致内存泄漏


由于其他对象拥有引用,您至少需要小心一点,以确保将它们全部释放。我喜欢确保它们不被绑定到任何地方,然后按与创建相反的顺序发布。由于其他对象拥有引用,您至少需要注意确保您将它们全部发布。我喜欢确保它们不被绑定到任何地方,然后按与创建相反的顺序发布。