我正在研究3D引擎作为学校项目。 我已经安装了虚拟泄漏检测器来摆脱内存泄漏(并且它工作,因为我不再获得任何这些转储)。 最近,我不小心让我的应用程序运行了5分钟...... 而我的电脑变得很慢。 我通过注释掉行等来跟踪这个问题,但是我无法找到为什么在我关闭应用程序之前C ++不会释放我已清除的内存。
问题: “内部”内存泄漏,看起来C ++只会在应用关闭后删除某些内容
CODE: My render code (at pastebin Yz79Ck0b)
注意: 我知道我不应该每次创建一个新的Mesh,但这不应该导致这个问题,对吧? 我的IDE是Visual Studio 2008,我正在使用WIN32项目。 当我取出纹理和模型时,我有0字节的内存增长。
答案 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;
我可能更具体,但需要查看类的定义。