簡體   English   中英

具有D3DX9的C ++-內存大小以10 MB /秒的速度不斷增加-為什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM