vkCreateinStance会引发分割故障

vkCreateInstance throws Segmentation Fault

本文关键字:分割 故障 vkCreateinStance      更新时间:2023-10-16

我正在尝试学习一些vulkan,并且我对vkCreateInstance有一个奇怪的问题。它似乎会抛出细分错误,但仅在非常具体的情况下。更明确,这里有一些代码:

int main() {
    // Load Vulkan Functions, extensions and stuff
    VkApplicationInfo applicationInfo;
    applicationInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
    applicationInfo.pNext = nullptr;
    applicationInfo.pApplicationName = "VulkanDoodles";
    applicationInfo.applicationVersion = VK_MAKE_VERSION(1,0,0);
    applicationInfo.pEngineName = "EngineNamePlaceholder";
    applicationInfo.engineVersion = VK_MAKE_VERSION(1,0,0);
    applicationInfo.apiVersion = VK_MAKE_VERSION(1,0,0);
    VkInstanceCreateInfo instanceCreateInfo;
    instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
    instanceCreateInfo.pNext = nullptr;
    instanceCreateInfo.flags = 0;
    instanceCreateInfo.pApplicationInfo = &applicationInfo;
    instanceCreateInfo.ppEnabledLayerNames = nullptr;
    instanceCreateInfo.enabledExtensionCount = (uint32_t)desired_extensions.size();
    instanceCreateInfo.ppEnabledExtensionNames = &desired_extensions[0];
    VkInstance instance;
    if(vk::vkCreateInstance(&instanceCreateInfo, nullptr, &instance) != VK_SUCCESS){
        std::cout << "Could not create instance" << std::endl;
        return -1;
    }
    // rest of the code
    return 0;
}

它可以正常工作,创建了实例。因此,我决定将代码放入功能中以获得可读性。但是,如以下代码不再起作用:

VkInstance CreateInstance(const std::vector<const char*> extensions){
    VkApplicationInfo applicationInfo;
    applicationInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
    applicationInfo.pNext = nullptr;
    applicationInfo.pApplicationName = "VulkanDoodles";
    applicationInfo.applicationVersion = VK_MAKE_VERSION(1,0,0);
    applicationInfo.pEngineName = "EngineNamePlaceholder";
    applicationInfo.engineVersion = VK_MAKE_VERSION(1,0,0);
    applicationInfo.apiVersion = VK_MAKE_VERSION(1,0,0);
    VkInstanceCreateInfo instanceCreateInfo;
    instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
    instanceCreateInfo.pNext = nullptr;
    instanceCreateInfo.flags = 0;
    instanceCreateInfo.pApplicationInfo = &applicationInfo;
    instanceCreateInfo.ppEnabledLayerNames = nullptr;
    instanceCreateInfo.enabledExtensionCount = (uint32_t)extensions.size();
    instanceCreateInfo.ppEnabledExtensionNames = &extensions[0];
    VkInstance instance;
    if(vk::vkCreateInstance(&instanceCreateInfo, nullptr, &instance) != VK_SUCCESS){
        std::cout << "Could not create instance" << std::endl;
    }
    return instance;
}
int main(){
    // Load Vulkan Functions, extensions and stuff
    VkInstance instance = CreateInstance(desired_extensions);
    // rest of the code
}

呼叫vkCreateInstance会引发分段故障。考虑到下一个代码片段确实可以正常工作:

,扩展向量似乎并不是问题。
VkInstanceCreateInfo CreateInstanceInfo(const std::vector<const char*>& extensions){
    VkApplicationInfo applicationInfo;
    applicationInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
    applicationInfo.pNext = nullptr;
    applicationInfo.pApplicationName = "VulkanDoodles";
    applicationInfo.applicationVersion = VK_MAKE_VERSION(1,0,0);
    applicationInfo.pEngineName = "EngineNamePlaceholder";
    applicationInfo.engineVersion = VK_MAKE_VERSION(1,0,0);
    applicationInfo.apiVersion = VK_MAKE_VERSION(1,0,0);
    VkInstanceCreateInfo instanceCreateInfo;
    instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
    instanceCreateInfo.pNext = nullptr;
    instanceCreateInfo.flags = 0;
    instanceCreateInfo.pApplicationInfo = &applicationInfo;
    instanceCreateInfo.ppEnabledLayerNames = nullptr;
    instanceCreateInfo.enabledExtensionCount = (uint32_t)extensions.size();
    instanceCreateInfo.ppEnabledExtensionNames = &extensions[0];
    return instanceCreateInfo;
}
VkInstance CreateInstance(const VkInstanceCreateInfo& instanceCreateInfo){
    VkInstance instance;
    if(vk::vkCreateInstance(&instanceCreateInfo, nullptr, &instance) != VK_SUCCESS){
        std::cout << "Could not create instance" << std::endl;
    }
    return instance;
}
int main(){
    // Load Vulkan Functions, extensions and stuff
    VkInstanceCreateInfo instanceCreateInfo = CreateInstanceInfo(desired_extensions);
    VkInstance instance = CreateInstance(instanceCreateInfo);
    // rest of the code
}

正如之前所说的那样,我的猜测是VkInstanceCreateInfo变量必须在main函数中声明。

所以我的问题是:

为什么 vkCreateInstance抛出segfault?为什么有时只有?那里有一些奇怪的事情吗?

任何见解都会非常有帮助。

也为了记录,我将使用CMAKE版本3.13使用Linux Mint和Clion(不确定是否重要)

您的中间代码片段缺少enabledLayerCount初始化,因此您使驱动程序do ooba。

您的最后一个摘要返回instanceCreateInfo,其中pApplicationInfo指向vkCreateInstance使用时销毁的VkApplicationInfo。您将驱动程序取消指针指向破坏的内存。