创建逻辑设备时出现访问冲突

Getting access violation while creating logical devices

我收到以下错误:

Exception thrown at VkLayer_khronos_validation.dll Exception thrown at 0x00007FFA5252DD05 (VkLayer_khronos_validation.dll) Access violation reading location 0xFFFFFFFFFFFFFFFF.

我的代码:

void LogicalDevice::createLogicalDevice(VkPhysicalDevice pDevice){
VkDeviceQueueCreateInfo qcreateInfo;
qcreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
QueueFamiliesIndices indices = PhysicalDevice::findQueueFamilies(pDevice);
qcreateInfo.queueFamilyIndex = indices.graphicsFamily.value();
qcreateInfo.queueCount = 1;
float queuePriority = 1.0f;
qcreateInfo.pQueuePriorities = &queuePriority;

VkPhysicalDeviceFeatures deviceFeatures = {};

VkDeviceCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
createInfo.pQueueCreateInfos = &qcreateInfo;
createInfo.queueCreateInfoCount = 1;
createInfo.pEnabledFeatures = &deviceFeatures;

createInfo.enabledExtensionCount = 0;

if (ValidationLayers::enableValidationLayers){
     createInfo.enabledLayerCount = static_cast<uint32_t>(ValidationLayers::validationLayers.size());
     createInfo.ppEnabledLayerNames = ValidationLayers::validationLayers.data();

}
else{
     createInfo.enabledLayerCount = 0;
     createInfo.pNext = nullptr;
}
createInfo.flags = 0;

if (vkCreateDevice(pDevice, &createInfo ,nullptr, &device) != VK_SUCCESS){
    std::cout << "Failed to create Logical Device";
}

}

未初始化VkDeviceQueueCreateInfo。初始化指针 (pNext) 导致错误的指针取消引用。它发生在调试模式下,因为它使用调试内存模式。在 Release 模式下,未初始化的值通常恰好为 0。

在 Vulkan 的 C 绑定中处理此问题的典型方法之一是使用 {}struct 进行零初始化。例如。 VkDeviceQueueCreateInfo dqci = {};。或者在 C99 和 C++20 中有指定的初始化程序。对于大多数 Vulkan 参数,零是一个不错的默认值。