C++函数调用后丢失的数据

C++ data lost after function call

本文关键字:数据 函数调用 C++      更新时间:2023-10-16

我想这是一件非常微不足道的事情,但我被困住了,找不到有什么问题:

std::vector<const char*> getExtensions()
{
    std::vector<const char*> 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(extension.extensionName);
    }
    return extensions;
}

因此,如果我从这里调用它:

bool checkSupportedExtensions(const std::vector<const char*> extensions)
{
    // make sure that we support all requested extensions
    bool found;
    for (const auto& availableExtenstion : getExtensions())
    {

可用扩展充满了胡言乱语。

我猜在 getExtensions 函数中我插入了 char*,一旦函数执行就会被删除,对吧?如果是这种情况,如何将字符串保留在向量中?

谢谢!

您有一个指向已删除变量的指针向量。

你应该改用 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;
}

您可以尝试使用字符串向量代替std::vector<std::string> .试试吧 ... extensions.push_back(std::string(extension.extensionName)); ... 看看它是否有效。您也可以在将扩展名推回矢量之前打印出扩展名,并查看它们是否是有意义的字符串。

您的代码中存在几个问题。

首先,在向量中存储指向 char 的指针。您无法控制向量中的指针所引用的内存会发生什么情况。

尝试

  std::vector<std:string> extensions;

其次,虽然这不是错误,但按值返回大型数据结构不是一个好主意,因为您可能会获得大量复制。

您关于数据丢失的正确性为 availableExtensions ,其中包含实际数据 一旦函数getExtensions()返回给调用方,就会被删除(由于超出范围(。

您需要的是将extension.extensionName数据从本地堆栈复制到堆中,以便只要您维护getExtensions()返回的vector,它就会存在。但是,这也意味着当您完成使用它时,您也有责任释放/删除它,这使得事情有点困难。

代码的简单解决方案是使用本质上为您执行相同操作的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));