【发布时间】:2019-11-06 08:39:54
【问题描述】:
您好,我在创建和释放顶点着色器时发生了内存泄漏。
这是我编译的着色器https://pastebin.com/raw/4w8tyY1n
这是我非常简单的代码,我只是创建设备和上下文,然后是顶点着色器,然后我都在一个循环中释放。
HRESULT hr;
while(true)
{
ID3D11Device* device;
ID3D11DeviceContext* deviceCtx;
ID3D11VertexShader* vertexShader;
hr = D3D11CreateDevice (
nullptr,
D3D_DRIVER_TYPE_HARDWARE,
nullptr,
D3D11_CREATE_DEVICE_BGRA_SUPPORT,
nullptr,
0,
D3D11_SDK_VERSION,
&device,
nullptr,
&deviceCtx);
if (SUCCEEDED (hr))
{
UINT Size = ARRAYSIZE (g_VS);
hr = device->CreateVertexShader (g_VS, Size, nullptr, &vertexShader);
if (SUCCEEDED (hr))
{
vertexShader->Release ();
}
deviceCtx->Release ();
device->Release ();
}
}
我对此感到困惑,我已经阅读了所有可能的 msdn 文档,但我只是不知道可能是什么问题。
【问题讨论】:
-
是什么让你认为你有内存泄漏?你检查什么指标?您是否了解“while(true)”循环具有可能看起来像内存泄漏但不完全是内存泄漏的副作用?代码对我来说运行良好。
-
嗨,我发现当我运行代码时,内存上升到 450 MB,然后应用程序在 hr = device->CreateVertexShader (g_VS, Size, nullptr, &vertexShader);在 D3D11.exe 中的 0x771D5D15 (ntdll.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x00000008。发生当我评论 CreateVertexShader 行时没有问题,我一直低于 20 兆字节。
-
好的所以我发现它只发生在英特尔 GPU 上,它似乎可能与这里的问题相同forums.intel.com/s/question/0D70P0000068e6USAQ/…
-
使用 C++ 时,您不应该依赖手动
AddRef``` /Release`` 调用 COM 对象,因为它太容易错过。只需使用ComPtr。
标签: memory-leaks directx directx-11 vertex-shader