You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

std::make_unique重载不匹配求助:DXGI信息队列内存分配报错

解决std::make_unique数组分配的参数匹配错误

错误根源在于std::make_unique<T[]>的数组重载版本要求参数为std::size_t类型,而代码中messageLength是Windows平台的SIZE_T类型(typedef的无符号整数类型),部分编译器无法完成隐式类型转换,导致重载匹配失败。以下是几种可行的解决方案:

方案1:显式转换参数类型

将SIZE_T类型的messageLength强制转换为std::size_t,让编译器匹配正确的重载:

HRESULT hr;
SIZE_T messageLength;
// 获取消息字节大小
GFX_THROW_NOINFO(pDxgiInfoQueue->GetMessage(DXGI_DEBUG_ALL, i, nullptr, &messageLength));

// 显式转换参数类型
auto bytes = std::make_unique<byte[]>(static_cast<std::size_t>(messageLength));

方案2:直接用new构造std::unique_ptr

绕开std::make_unique,直接通过new分配数组后交给std::unique_ptr管理(兼容C++11及以上):

HRESULT hr;
SIZE_T messageLength;
GFX_THROW_NOINFO(pDxgiInfoQueue->GetMessage(DXGI_DEBUG_ALL, i, nullptr, &messageLength));

// 直接构造unique_ptr
std::unique_ptr<byte[]> bytes(new byte[messageLength]);

方案3:改用std::vector管理内存

用std::vector替代智能指针数组,自动处理内存分配与释放,代码更简洁:

HRESULT hr;
SIZE_T messageLength;
GFX_THROW_NOINFO(pDxgiInfoQueue->GetMessage(DXGI_DEBUG_ALL, i, nullptr, &messageLength));

// 用vector分配内存
std::vector<byte> bytes(messageLength);
auto pMessage = reinterpret_cast<DXGI_INFO_QUEUE_MESSAGE*>(bytes.data());
// 获取消息并将描述存入vector
GFX_THROW_NOINFO(pDxgiInfoQueue->GetMessage(DXGI_DEBUG_ALL, i, pMessage, &messageLength));
messages.emplace_back(pMessage->pDescription);

内容的提问来源于stack exchange,提问作者csnorbi1227

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:16:03