c++ - 0xC0000005:在位置 0xDDDDDDDD 读取时访问冲突。C++
问题描述
标题
#include <iostream>
#define GLFW_INCLUDE_VULKAN
#include "GLFW\glfw3.h"
#include "PhysicalDeviceVK.h"
#define CATCH(value) if(value != VK_SUCCESS){ __debugbreak;}
class DeviceVK
{
private:
/**
* @return VkPhysicalDevice Get the best physical device.
*/
VkPhysicalDevice getPhysicalDevice(VkInstance instance);
/**
* @return uint32_t Get the index of the best queue family.
*/
uint32_t getQueueFamily(std::vector<VkQueueFamilyProperties> queueFamilies);
/**
* @return VkDeviceCreateInfo create the device create info.
*/
VkDeviceCreateInfo createDeviceCreateInfo();
public:
VkDevice device = nullptr;
VkQueue queue = nullptr;
PhysicalDeviceVK physicalDevice;
uint32_t queueIndex = NULL;
DeviceVK(VkInstance instance, VkSurfaceKHR surface);
DeviceVK() {}
};
C++ 文件
#include "DeviceVK.h"
DeviceVK::DeviceVK(VkInstance instance, VkSurfaceKHR surface)
{
VkPhysicalDevice bestGPU = getPhysicalDevice(instance);
this->physicalDevice = PhysicalDeviceVK(bestGPU);
VkDeviceCreateInfo deviceCreateInfo = createDeviceCreateInfo();
CATCH(vkCreateDevice(bestGPU, &deviceCreateInfo, nullptr, &this->device));
vkGetDeviceQueue(this->device, this->queueIndex, 1, &this->queue);
this->physicalDevice.debug(surface);
}
VkPhysicalDevice DeviceVK::getPhysicalDevice(VkInstance instance)
{
uint32_t amountOfGraphicCards = 0;
vkEnumeratePhysicalDevices(instance, &amountOfGraphicCards, nullptr);
VkPhysicalDevice* physicalDevices = new VkPhysicalDevice[amountOfGraphicCards];
CATCH(vkEnumeratePhysicalDevices(instance, &amountOfGraphicCards, physicalDevices));
int bestGPU = 0, maxHeap = 0;
for (int i = 0; i < amountOfGraphicCards; i++)
{
PhysicalDeviceVK physicalDevice(physicalDevices[i]);
VkPhysicalDeviceMemoryProperties memoryProperties = physicalDevice.getPhysicalDeviceMemoryProperties();
auto heapsPointer = memoryProperties.memoryHeaps;
auto heaps = std::vector<VkMemoryHeap>(heapsPointer, heapsPointer + memoryProperties.memoryHeapCount);
for (const auto& heap : heaps)
{
if (heap.flags & VkMemoryHeapFlagBits::VK_MEMORY_HEAP_DEVICE_LOCAL_BIT)
{
if (maxHeap < heap.size)
{
maxHeap = heap.size;
bestGPU = i;
}
}
}
}
VkPhysicalDevice bestDevice = physicalDevices[bestGPU];
return bestDevice;
}
uint32_t DeviceVK::getQueueFamily(std::vector<VkQueueFamilyProperties> queueFamilies)
{
return ((uint32_t)0);
}
VkDeviceCreateInfo DeviceVK::createDeviceCreateInfo()
{
std::vector<VkQueueFamilyProperties> queueFamilies = this->physicalDevice.getQueueFamilyProperties();
this->queueIndex = getQueueFamily(queueFamilies);
VkDeviceQueueCreateInfo deviceQueueCreateInfo;
deviceQueueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
deviceQueueCreateInfo.pNext = nullptr;
deviceQueueCreateInfo.flags = 0;
deviceQueueCreateInfo.queueFamilyIndex = this->queueIndex;
deviceQueueCreateInfo.queueCount = queueFamilies.size();
const float queuePriorityValue = 1.0f;
deviceQueueCreateInfo.pQueuePriorities = &queuePriorityValue;
queueFamilies.clear();
VkPhysicalDeviceFeatures deviceFeatures = {};
const std::vector<const char*> deviceExtensions =
{
VK_KHR_SWAPCHAIN_EXTENSION_NAME
};
VkDeviceCreateInfo deviceCreateInfo;
deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
deviceCreateInfo.pNext = nullptr;
deviceCreateInfo.flags = 0;
deviceCreateInfo.queueCreateInfoCount = 1;
deviceCreateInfo.pQueueCreateInfos = &deviceQueueCreateInfo;
deviceCreateInfo.enabledLayerCount = 0;
deviceCreateInfo.ppEnabledLayerNames = nullptr;
deviceCreateInfo.enabledExtensionCount = deviceExtensions.size();
deviceCreateInfo.ppEnabledExtensionNames = deviceExtensions.data();
deviceCreateInfo.pEnabledFeatures = &deviceFeatures;
return deviceCreateInfo;
}
我在这里打电话给班级
void VulkanGraphic::createDevice()
{
this->deviceVK = DeviceVK(this->instance, this->surface);
}
每次运行这个程序时,它都会崩溃,因为
0xC0000005:在位置 0xDDDDDDDD 读取时访问冲突。
我还尝试删除出现错误的最后两行。但它实际上说,程序在构造函数的末尾崩溃,那里有一个空行。
我正在使用 Vulkan 和 GLFW
解决方案
推荐阅读
- c# - 在非控制器模型上通过 Ilogger
- kubernetes - 未找到命名空间
- wpf - 我可以在没有 DependencyProperty 的情况下连接两个 ViewModel 吗?
- tornado - 如何在 Tornado 中传递环境变量(数据库 URL)?
- javascript - 单选按钮在反应中不调用 setState
- bash - 最后一步 - 为目录中的所有文件运行此脚本
- python - 如何对包含 base64 编码图像的字典列表执行 json.dumps
- r - 绘制存储在多个页面列表中的 ggplots
- java - 通过自动配置作为模块打开附加端口时,应用程序无法启动
- windows - 如何在不同的时间一个接一个地执行一个命令?