带有D3DX9的C ++ - 内存大小以10 MB /秒的速度增长 - 为什么?

时间:2010-12-13 17:30:32

标签: c++ 3d directx

我正在研究3D引擎作为学校项目。 我已经安装了虚拟泄漏检测器来摆脱内存泄漏(并且它工作,因为我不再获得任何这些转储)。 最近,我不小心让我的应用程序运行了5分钟...... 而我的电脑变得很慢。 我通过注释掉行等来跟踪这个问题,但是我无法找到为什么在我关闭应用程序之前C ++不会释放我已清除的内存。

问题: “内部”内存泄漏,看起来C ++只会在应用关闭后删除某些内容

CODE: My render code (at pastebin Yz79Ck0b)

注意: 我知道我不应该每次创建一个新的Mesh,但这不应该导致这个问题,对吧? 我的IDE是Visual Studio 2008,我正在使用WIN32项目。 当我取出纹理和模型时,我有0字节的内存增长。

3 个答案:

答案 0 :(得分:6)

正如Sanjit所说,你必须使用delete[]来删除数组 - 正如DeadMG所说,RAII容器是最好的做法,不会弄乱你的资源。

然而,尽管文档中并不是很明显,但显然所有Direct3d resources(包括IDirect3d9Texture创建的D3DXCreateTextureFromFile)都继承自IUnknown - 它们是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编写比玩具应用程序更大的东西,那么就像它一样。

答案 1 :(得分:2)

m_Material是一个数组,你需要[]和delete运算符:

delete[] m_Material;

另外,看起来m_Texture是一个新建的指针数组。 D3DXCreateTextureFromFileA(m_Device,d3dxMaterials [i] .pTextureFilename,&amp; 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;

答案 2 :(得分:1)

您需要使用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;

我可能更具体,但需要查看类的定义。