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