2009-11-27 23 views
0

来的时候加载使用的着色器如下:代码泄漏内存,似乎是从ID3DXBuffer

ID3DXBuffer* errors = 0; 
ID3DXEffect* effect = 0; 

HR(D3DXCreateEffectFromFile(
    gd3dDevice, L"Shader.fx", 0, 0, 
    D3DXSHADER_DEBUG|D3DXSHADER_SKIPOPTIMIZATION, 
    0, &effect, &errors)); 

for (int i = 0; i < 3; i++) { 
    if(errors) { 
     errors->Release(); 
     if (effect) 
      effect->Release(); 

     errors = 0; 
     HR(D3DXCreateEffectFromFile(gd3dDevice, L"Shader.fx", 
      0, 0, D3DXSHADER_DEBUG, 0, effect, &errors)); 
    } 
    else 
     break; 
} 

这是试图加载着色器,如果它得到一个错误/警告再次尝试3次以上之前放弃。

现在,当我关闭应用程序D3DX给我下面的消息,我发现:

D3DX:内存泄漏检测到:2个分配unfreed(486个字节)

当有错误,这只是发生(即它进入循环)。我真的不确定为什么会发生这种情况,有什么想法?

好的,我修正了它,只是一个逻辑问题,'错误'在第三次尝试时没有'释放'调用,因此这个问题。

回答

0

好的我修正了它,只是一个逻辑问题,'错误'在第三次尝试时没有'释放'对它的调用,因此这个问题。

+0

仍然,如果您的系统上可用我会尝试使用像CComPtr的东西,而不是原始指针持有这些接口。 – Robinson 2011-05-27 14:29:05

+0

使用随VS 2013附带的VS 2012或Windows 8.1 SDK附带的Windows 8.0 SDK,您可以使用“Microsoft :: WRL :: ComPtr”,该DLL对WinRT或WinRT没有任何依赖关系ATL。它基本上和ATL的''CComPtr''一样,但是更强大一点。 – 2014-12-10 00:41:12

2

注意:即使DX函数(例如D3DXCreateEffectFromFile)没有失败,也应该释放ID3DXBuffer。