创建信息会破坏实例化

问题描述 投票:0回答:1

在我决定启用 VK_KHR_SWAPCHAIN_EXTENSION_NAME 扩展后,我开始收到错误“在地址 0xFFFFFFFFFFFFFFFF 读取时发生访问权限冲突”。在 vkCreateInstance 执行行中。

调试后,我注意到问题在于填充VkInstanceCreateInfo结构体的ppEnabledExtensionNames值。我决定将 glfw 扩展包装到一个向量中,并使用它来填充结构。 这是填充此结构的函数的代码。

VkInstanceCreateInfo VulkanManager::paste_create_info(VkApplicationInfo* app_info)
{
    VkInstanceCreateInfo create_info{};
    vector<const char*> device_extensions = {
        VK_KHR_SWAPCHAIN_EXTENSION_NAME,
    };
    uint32_t glfw_extensions_count = 0;
    const char** glfw_extensions;

    create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
    create_info.pApplicationInfo = app_info;

    glfw_extensions = glfwGetRequiredInstanceExtensions(&glfw_extensions_count);

    for (int i = 0; i < glfw_extensions_count; i++)
        device_extensions.push_back(glfw_extensions[i]);

    create_info.enabledExtensionCount = (uint32_t) device_extensions.size();
    create_info.ppEnabledExtensionNames = device_extensions.data();

    create_info.enabledLayerCount = 0;

    return create_info;
}

填充VkApplicationInfo结构的代码:

{
    VkApplicationInfo app_info{};

    app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
    app_info.pApplicationName = "Triangle";
    app_info.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
    app_info.pEngineName = "No Engine";
    app_info.engineVersion = VK_MAKE_VERSION(1, 0, 0);
    app_info.apiVersion = VK_API_VERSION_1_0;

    return app_info;
}

以及创建vulkan实例的代码:

void VulkanManager::create_vulkan()
{
    VkApplicationInfo app_info = VulkanManager::paste_app_info();
    VkInstanceCreateInfo create_info = VulkanManager::paste_create_info(&app_info);

这很可能是与指针相关的错误;指针在转移到向量时可能会丢失其值

c++ pointers glfw vulkan
1个回答
0
投票

返回

device_extensions
后,
VulkanManager::paste_create_info()
中的
create_info
将超出范围,因此当您在某处调用
vkCreateInstance(create_info)
时,
create_info.ppEnabledExtensionNames
将指向无效地址,导致内存访问冲突。

作为旁注,您应该将

device_extensions
重命名为
instance_extensions
,因为这是两个不同的概念,如此处所述。

© www.soinside.com 2019 - 2024. All rights reserved.