2011-06-09 60 views
1

我只是在學習directx。一個通常創建通過功能一個DirectX設備和其他幾個COM接口調用諸如清理directx,正確釋放com引用

ID3D11CreateDeviceAndSwapChain(.... ,& device, ...); 

在所有教程代碼我所看到的,COM接口使用一個類似於釋放到

if (pointer_to_com_object) { 
    pointer_to_com_object->Release(); 
    pointer_to_com_object = 0; 
} 

例如以下內容摘自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對象永遠沒有你沒有建立對它們的引用?

我只是問,因爲我總是看到作爲我學習它做這種方式。

回答

4

COM對象是參考計數。當您撥打Release()時,您實際上正在遞減內部參考計數。如果另一個對象仍然擁有一個引用,它不會被銷燬。

如果應用程序的其他部分最終會產生一個新的參考COM對象,請確保您撥打Release(),當你用它做。仔細閱讀返回引用的方法的文檔,以瞭解是否必須致電Release()。通常你必須。

例如在IDirect3DTexture9::GetSurfaceLevel文檔:

調用此方法會增加 IDirect3DSurface9接口上的 內部引用計數。失敗 調用的IUnknown ::發行時 使用內存泄漏這IDirect3DSurface9 接口結果完成。

+1

由於其他對象擁有引用,你需要至少需要一點關懷,以確保你釋放他們所有。我喜歡確保它們不受任何限制,然後按照創建的相反順序進行發佈。 – ssube 2011-06-09 20:56:48