我想这是非常微不足道的事情,但我已经陷入困境,无法找到错误:
bool checkSupportedExtensions(const std::vector<const char*> extensions)
{
// make sure that we support all requested extensions
bool found;
for (const auto& availableExtenstion : getExtensions())
{
所以,如果我从这里打电话:
.sql
availableExtenstion充满了胡言乱语。
我猜测在getExtensions函数中我插入了char *,一旦执行该函数就会删除它,对吧?如果是这种情况,如何将字符串保存在向量中?
谢谢!
答案 0 :(得分:4)
你有一个指针向量,可以指向已删除的变量。
您应该使用std :: string代替:
std::vector<std::string> getExtensions()
{
std::vector<std::string> extensions;
// let's get a list of available extensions from Vulkan
uint32_t availableExtensionCount = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &availableExtensionCount, nullptr);
std::vector<VkExtensionProperties> availableExtensions(availableExtensionCount);
vkEnumerateInstanceExtensionProperties(nullptr, &availableExtensionCount, availableExtensions.data());
for (const VkExtensionProperties& extension : availableExtensions)
{
extensions.push_back(std::string(extension.extensionName));
}
return extensions;
}
答案 1 :(得分:3)
您可以尝试使用字符串向量std::vector<std::string>
。试一试
...
extensions.push_back(std::string(extension.extensionName));
...
看看它是否有效
此外,您可以打印扩展名,然后再将它们推回向量,看看它们是否是有意义的字符串。
答案 2 :(得分:3)
您的代码中存在一些问题。
首先,您在向量中存储指向char的指针。你无法控制向量中的指针引用的内存会发生什么。
尝试
std::vector<std:string> extensions;
其次,虽然它不是错误,但按值返回大型数据结构并不是一个好主意,因为你可以进行大量复制。
答案 3 :(得分:1)
您对availableExtensions
丢失的数据是正确的,其中包含实际数据一旦函数getExtensions()
返回给调用者就被删除(由于超出范围)。
您需要的是将extension.extensionName
数据从本地堆栈复制到堆中,这样只要您维护vector
返回的getExtensions()
,它就会存在。但是,这也意味着当你使用它时,你也有责任释放/删除它,这使事情变得有点困难。
代码的简单解决方案是使用std::string
,它基本上为您做同样的事情。因此,您唯一需要做的就是将矢量定义从std::vector<const char*>
更改为std::vector<std::string>
如果您正在寻找效率更高的解决方案,请在将数据插入向量时使用std::vector<std::unique_ptr<std::string>>
向量,并进行以下更改
extensions.push_back(std::make_unique<std::string>(extension.extensionName));