2012-11-24 91 views
1

例如,我在循環中運行的代碼:IASetIndexBuffer內存泄漏原因

m_device->CreateBuffer(&index_buffer_desc, &index_data, &buffer); 
Release(buffer); 

其中m_device是ID3D11Device和緩衝器是ID3D11Buffer

沒有泄漏 - 我創建對象,然後破壞它。

如果我把它安裝到管道,像這樣:

m_device->CreateBuffer(&index_buffer_desc, &index_data, &buffer); 
m_device_context->IASetIndexBuffer(buffer, DXGI_FORMAT_R32_UINT, 0); 
Release(buffer); 

比內存泄漏開始。

MSDN對IASetIndexBuffer說:「該方法不會持有對傳入接口的引用。因此,應用程序應小心不要釋放當前正在使用的接口。」

好的。我重置索引緩衝區後附加:

m_device->CreateBuffer(&index_buffer_desc, &index_data, &buffer); 
m_device_context->IASetIndexBuffer(buffer, DXGI_FORMAT_R32_UINT, 0); 
m_device_context->IASetIndexBuffer(NULL, DXGI_FORMAT_R32_UINT, 0); 
Release(buffer); 

但內存盜竊泄漏。

是什麼原因?這個東西還在哪裏?

+0

如何檢查內存是否泄漏?如果沒有更多的外部引用,DirectX會使用一些內部引用,這些引用最終可能會被丟棄。 –

+0

剛剛看了一下任務管理器 - 應用程序增長10mb /秒(specialy運行沒有vsync) – acrilige

+0

嘗試在上下文中調用'ClearState()'和'Flush()'。順便說一句,你確定你需要一個新的索引緩衝區每幀? –

回答

0

真的,我只是重新啓動這個代碼,沒有任何反應,沒有泄漏。沒有什麼改變。這真是奇怪的行爲。

在發佈此問題之前,請務必嘗試使用ID3D11DeviceContext :: ClearState方法,但內存會泄露泄漏。

無論如何,現在都很好。