[英]C++ with D3DX9 - Memory size keeps increasing at a rate of 10 MB/sec - Why?
我正在研究3D引擎作為學校項目。 我已經安裝了虛擬泄漏檢測器來消除內存泄漏(並且可以正常工作,因為我不再需要這些轉儲了)。 最近,我不小心使我的應用程序運行了5分鍾。。。 我已經通過注釋掉行等找到了問題,但是我不知道為什么C ++在關閉應用程序之前不會釋放清除的內存。
問題:“內部”內存泄漏,似乎C ++僅在應用程序關閉后才刪除某些內容
代碼: 我的渲染代碼(位於pastebin Yz79Ck0b)
注意:我知道我不應該每次都創建一個新的Mesh,但這不應該引起這個問題,對嗎? 我的IDE是Visual Studio 2008,並且我正在使用WIN32項目。 取出紋理和模型時,內存增長為0字節。
正如Sanjit所說,您必須使用delete[]
刪除數組-正如DeadMG所說,RAII容器是不浪費資源的最佳實踐方法。
但是,盡管從文檔中並不能立即看出,但是顯然所有Direct3d資源 (包括D3DXCreateTextureFromFile
創建的IDirect3d9Texture
)都從IUnknown
繼承-換句話說,它們是COM對象。 使用.Release()
COM對象后,您需要.Release()
COM對象:
for (int i=0; i<len; i++)
if (m_Texture[i] != NULL)
m_Texture[i]->Release();//decrement COM refcount to permit releasing the resource
delete[] m_Texture;
delete[] m_Material;
您可能想養成將循環邏輯包裝到方便的RAII容器中的習慣。 ATL內置了這樣的東西,請參閱CComPtr
上的MSDN文檔。 警告:我以前從未使用過它,但是如果您打算使用COM編寫比玩具應用程序還要大的東西,那就像一個很好的主意。
m_Material是一個數組,需要帶刪除運算符的[]:
delete[] m_Material;
同樣,看起來m_Texture是一個新的指針數組。 D3DXCreateTextureFromFileA(m_Device,d3dxMaterials [i] .pTextureFilename,&m_Texture [i])
刪除動態分配的指針數組的正確方法是:
for (int i=0; i<len; i++)
{
// first delete memory for each index
if (m_Texture[i] != NULL)
{
delete m_Texture[i];
}
}
// then delete the array
delete[] m_Texture;
您需要使用RAII處理任何需要釋放的資源,而不是手動釋放它們。
template<typename T> class self_release_ptr {
T* ptr;
public:
self_release_ptr(T* newptr) : ptr(newptr) {}
self_release_ptr() : ptr(0) {}
~self_release_ptr() { if (ptr) ptr->Release(); }
// etc
};
std::vector<self_release_ptr<texture_type>> m_Texture;
我可以更具體一些,但是需要查看類的定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.