C++ 为什么重新创建D3D12命令分配程序会导致内存泄漏

C++ 为什么重新创建D3D12命令分配程序会导致内存泄漏,c++,memory-leaks,c++-winrt,directx-12,C++,Memory Leaks,C++ Winrt,Directx 12,我进行了以下实验 pch.h #pragma一次 #包括 #包括 #包括 #包括 #包括 main.cpp #包括“pch.h” 使用名称空间winrt; 使用名称空间Windows::Foundation; int main() { init_公寓(); com_ptr调试控制器; winrt::check_hresult(D3D12GetDebugInterface(guid_of(),debugController.put_void()); 调试控制器->启用调试层(); 工厂; 检查结

我进行了以下实验
pch.h

#pragma一次
#包括
#包括
#包括
#包括
#包括
main.cpp

#包括“pch.h”
使用名称空间winrt;
使用名称空间Windows::Foundation;
int main()
{
init_公寓();
com_ptr调试控制器;
winrt::check_hresult(D3D12GetDebugInterface(guid_of(),debugController.put_void());
调试控制器->启用调试层();
工厂;
检查结果(CreateDXGIFactory1(guid\u of(),dxgiFactory.put\u void());
com_ptr dxgiAdapter{nullptr};
检查结果(dxgiFactory->EnumAdapters1(0,dxgiAdapter.put());
通信ptr设备;
检查\u hresult(D3D12CreateDevice(dxgiAdapter.get(),D3D\u功能\u级别\u 11\u 0,guid\u of(),device.put\u void());
com_ptr device4=device.as();
//第一区
//此块导致内存泄漏
{
com_ptr命令列表;
device4->CreateCommandList1(0,D3D12_命令_列表_类型_直接,D3D12_命令_列表_标志_无,guid_of(),commandList.put_void());
while(true)
{
com_ptr命令分配器;
device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT,guid_of(),commandAllocator.put_void());
commandList->Reset(commandAllocator.get(),nullptr);
commandList->Close();
命令分配器->重置();
}
}
//第2区
//这个街区行为正常
{
com_ptr命令列表;
while(true)
{
com_ptr命令分配器;
device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT,guid_of(),commandAllocator.put_void());
com_ptr命令列表;
device->CreateCommandList(0,D3D12_COMMAND_LIST_TYPE_DIRECT,commandAllocator.get(),nullptr,guid_of(),commandList.put_void());
commandList->Close();
命令分配器->重置();
}
}
//第3区
//此块表示最常见的工作流
{
com_ptr命令列表;
device4->CreateCommandList1(0,D3D12_命令_列表_类型_直接,D3D12_命令_列表_标志_无,guid_of(),commandList.put_void());
com_ptr命令分配器;
device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT,guid_of(),commandAllocator.put_void());
while(true)
{
commandList->Reset(commandAllocator.get(),nullptr);
commandList->Close();
命令分配器->重置();
}
}
}
执行块1(通过注释其他块)会导致可怕的内存泄漏

但在执行块2和块3时,内存使用量几乎保持不变

块1在每个帧中重新创建D3D12命令分配器。
块2在每个帧中重新创建D3D12CommandAllocator和D3D12CommandList。
块3表示最常见的工作流


但是为什么块1会导致内存泄漏。

您能告诉我您使用的是什么项目吗?它是DirectX 12应用程序(通用Windows-C++/CX)?我使用的是Windows控制台应用程序(C++/WinRT)。我无法用您的代码重现内存泄漏。你能给我们提供一个使用OneDrive或GitHub进行测试的样品吗?当然可以。我在onedrive上上传视频,在github上上传代码,但如果你不能复制,可能是驱动程序问题?我使用的是Surface Pro 7+i7 1165g7和intel iris Xe Grahpics驱动程序27.20.100.8853
#pragma once
#include <Unknwn.h>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Foundation.Collections.h>
#include <d3d12.h>
#include <dxgi1_4.h>