繁体   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