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

标签 c++ 3d directx

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

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

代码: My render code (at pastebin Yz79Ck0b)

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

最佳答案

正如 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 编写比玩具应用程序更大的东西,那么类似的东西是一个非常好的主意。

关于带有 D3DX9 的 C++ - 内存大小以 10 MB/秒的速度不断增加 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4431624/

相关文章:

c++ - DirectX 11 - 点光阴影

c++ - 将 LPDWORD 作为输出参数传递

c++ - 创建 D3DX 着色器

video-streaming - 在 MediaFoundation 硬件 MFT 中设置更大的 GOP 大小

android - Sceneform 的 Gradle 问题 - 程序类型已存在 : com. google.ar.schemas.lull

algorithm - 缩放 3D 模型,寻找原点

c++ - 使用 MatGeoLib 进行 3D 碰撞检测?

python - 如何通过opencv生成RGB直方图

c++ - C++中的指针和内存分配

没有虚函数的 C++ 动态调度