2017-05-24 58 views
0

我正在關注vulkan-tutorial.com教程和即時通訊驗證層步驟。在Alexander Overvoorde教程中,作者將用於創建實例的可用擴展集合移至其自己的函數中。爲什麼從方法中獲得vulkan擴展失敗了vulkan實例創建?

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個擴展加上調試之一。

回答

2

the documentation at Khronos.orgVkExtensionProperties看起來是這樣的:

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

...所以在這條線:

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

...你要存儲什麼爲extensionNames是指向住陣列在extensionProperties,這是你的函數的本地。當你從這個函數返回時,所有的數組都會被extensionProperties一起破壞,所有的指針現在都是懸掛的。
當Vulkan嘗試使用這些死指針時,你得到的是未定義的行爲。

+0

你能否告訴我最好的方法來通過這個?將使用'std :: vector > getRequiredExtensions()'工作?因爲我不能獲得'createInfo.ppEnabledExtensionNames = extensionNames.data();'採取'std :: vector << std :: shared_ptr >' –

+0

iv嘗試使用共享ptr,它不會工作,我真的想保留在這種情況下,函數 –

+1

@MatthewBuchanan的本地擴展屬性,我會說不要爲此付出汗水,並將您的API作爲優先級進行清理。返回一個'std :: vector ',並且在實際需要分配'createInfo.ppEnabledExtensionNames'的函數中爲這個任務創建一個'std :: vector '。 – Quentin