为什么从一个方法获得vulkan扩展会失败vulkan实例创建?

时间:2017-05-24 00:36:15

标签: c++ sdl-2 vulkan

我正在关注vulkan-tutorial.com教程和im验证层步骤。在教程Alexander Overvoorde中,作者将实例创建的可用扩展集合移动到了自己的函数中。

std::vector<const char*> getRequiredExtensions()

之前我收集的信息有点不同,因为我使用的是SDL2而不是glfw,但是我的程序运行实例并没有验证错误。问题是当我将代码移动到此函数时,我无法再创建实例。

这很好用:

unsigned int extensionCount = 0;
vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, NULL);
std::vector<VkExtensionProperties> extensionProperties(extensionCount);
vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, extensionProperties.data());
std::vector<const char*> extensionNames;
std::cout << "available extensions:" << std::endl;
int i = 0;
while (i < extensionCount) {
    extensionNames.push_back(extensionProperties[i].extensionName);
    std::cout << extensionNames[i] << std::endl;
    i++;
}
if (enableValidationLayers) {
    extensionNames.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
}*/
createInfo.enabledExtensionCount = extensionCount;
createInfo.ppEnabledExtensionNames = extensionNames.data();

但是这个失败了,即使该函数使用完全相同的代码并返回extensionNames,然后我会像这样使用它:

std::vector<const char*> extensionNames = getRequiredExtensions();
createInfo.enabledExtensionCount = static_cast<uint32_t>(extensionNames.size());
createInfo.ppEnabledExtensionNames = extensionNames.data();

那为什么这不起作用?我有一个正式的java背景,但用c ++编写了一年,所以它可能像语法错误或指针,我发错了。另外

reateInfo.enabledExtensionCount = static_cast<uint32_t>(getRequiredExtensions().size());

工作得很好所以返回的向量是正确的大小:5我相信因为我有4个扩展加上调试。

1 个答案:

答案 0 :(得分:2)

the documentation at Khronos.org开始,VkExtensionProperties看起来像这样:

typedef struct VkExtensionProperties {
    char        extensionName[VK_MAX_EXTENSION_NAME_SIZE];
    uint32_t    specVersion;
} VkExtensionProperties;

...在这一行:

extensionNames.push_back(extensionProperties[i].extensionName);

...您要存储到extensionNames中的是指向extensionProperties中的数组的指针,这些数组是您的函数的本地数据。从函数返回时,所有数组都与extensionProperties一起被破坏,所有指针现在都悬空了。
当Vulkan试图使用这些死指针时,你得到的是未定义的行为。