2009-11-27 4 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

+0

С SDK для Windows 8.0, который поставляется с VS 2012 или Windows 8.1 SDK, который поставляется с VS 2013, вы можете использовать '' Microsoft :: WRL :: ComPtr'', который не имеет никаких зависимостей от DLL, WinRT или АТЛ. Это в основном то же самое, что и «CComPtr» ATL, но немного более надежное. –

2

Примечание: ID3DXBuffer должен быть выпущен, даже если функция DX (например, D3DXCreateEffectFromFile) не сработала.