我收到以下错误:
在VkLayer_khronos_validation.dll上引发的异常在0x00007FFA5252DD05(VkLayer_khronos_validation.dll)上引发的异常访问冲突读取位置0xFFFFFFFFFFFFFFFFFF。
我的代码:
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
)会导致错误的指针取消引用。它在调试模式下发生,因为它使用调试内存模式。在发布模式下,未初始化的值通常恰好为0。
其中一个典型的方式来处理这福尔康的C绑定是零初始化struct
S采用{}
。例如VkDeviceQueueCreateInfo dqci = {};
。或者在C99和C ++ 20中指定了初始化程序。零是大多数Vulkan参数的不错的默认值。
我认为您应该阐明{}如何初始化事物,因为上述用户可能没有将其视为重要步骤。
当然可以,为什么不呢。但是,这甚至不是Vulkan特有的问题,我希望这是一个错字。任何处理Vulkan的人都应该已经对C / C ++或一般编程有不错的了解...
通过{}进行零初始化,即使教导的内容实际上仅用于c结构(如vulkan),也没有适当的构造函数。您可以一生都用c ++编程,而无需进行初始化,vulkan是5年来我第一次遇到该构造,这绝对不是典型的。
好吧,迟到总比没有好:p。众所周知,C ++中的初始化非常重要。虽然未初始化的值是基础知识。该
{}
修复程序是只有一种解释,并从我们基本上是根据意见建议。