1

我目前正在使用 DirectX 开发 C++ 游戏。引擎是我学校的一位教授给我们的,我一直在检查他引擎中的内存泄漏,我相信我已经将它们追溯到这种方法。首先,它甚至没有被调用,现在它被调用了,我不确定这是否是完全删除和清理 DirectX 加载的纹理的正确方法。

这是在 上调用的方法TextureManager

void DirectXTextureManager::clear()
{
    map<wchar_t*, LPDIRECT3DTEXTURE9>::iterator it;
    map<wchar_t*, LPDIRECT3DTEXTURE9>::iterator itToErase;
    it = textures->begin();
    while (it != textures->end())
    {
    wchar_t *keyToDelete = (*it).first;
    LPDIRECT3DTEXTURE9 textureToDelete = (*it).second;
    itToErase = it;
    it++;
    textures->erase(itToErase);
    delete keyToDelete;
    textureToDelete->Release();
    textureToDelete = NULL;
    }

    stringTable->emptyStringTable();
}
4

2 回答 2

1

关于纹理部分,一切似乎都很好——调用对象来释放它就足够了Release()LPDIRECT3DTEXTURE

LPDIRECT3DTEXTURE9 textureToDelete = (*it).second;
...
textureToDelete->Release();

我有点担心- 它是地图键中stringTable负责的部分吗?wchar_t*如果是这样,您应该检查什么stringTable->emptyStringTable(),也许不需要手动删除密钥。

于 2011-12-13T08:28:27.083 回答
0

是否DirectXTextureManager有任何其他方法可以调用Release()任何纹理?

如果是这样,那么也许不需要调用clear(). 特别是,检查类析构函数或其他一些UniInitialize()可能已经进行清理的“”方法是否存在。就个人而言,我也更喜欢使用标头中的SAFE_RELEASE()宏,DXUT因为它在调用 Release 之前检查指针是否为非空,然后将其设置为 NULL。

最后,您可能会发现使用由“DirectX 控制面板”(随 SDK 安装)控制的 DirectX 调试运行时的输出更容易进行调试。它将向 VisualStudio 输出窗口输出非常好的日志记录,包括关闭时未释放资源的详细信息,您可以使用这些详细信息对代码进行故障排除。

于 2011-12-14T01:54:09.473 回答