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
相关产品推荐
相关产品推荐

