c++ - C++ 中的 DirectX 纹理清理

标签 c++ memory-management iterator directx resource-cleanup

我目前正在使用 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();
}

最佳答案

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

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

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

关于c++ - C++ 中的 DirectX 纹理清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8485199/

相关文章:

python - 在 Python 2 中动态向迭代器添加属性

c++ - 在此上下文中使用符号 (&) 的说明

.net - 如何在不创建大缓冲区的情况下将大型 .NET 对象图序列化为 SQL Server BLOB?

objective-c - 分配给属性(property)会导致保留吗?

c++ - 我可以用模板处理迭代器吗?

java - ConcurrentModificationException 和 HashSet.iterator()

c++ - 求STL-aware c++filt

c++ - 在 Qt3D 中访问帧缓冲区

c++ - C++ 中 100 位数字的平方根

c - 编译器优化会影响动态内存分配吗?