【问题标题】:C++ data lost after function call函数调用后 C++ 数据丢失
【发布时间】:2017-03-27 20:36:29
【问题描述】:

我想这是一件非常微不足道的事情,但我被卡住了,找不到问题所在:

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())
    {

availableExtensions 充满了胡言乱语。

我猜我在 getExtensions 函数中插入了 char*,该函数一执行就被删除,对吧?如果是这样,如何将字符串保存在向量中?

谢谢!

【问题讨论】:

  • 使用std::string 而不是char *

标签: c++ function memory vector


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以尝试使用字符串向量代替std::vector&lt;std::string&gt;。你试一试 ... extensions.push_back(std::string(extension.extensionName)); ... 看看它是否有效。 您还可以在将它们推回向量之前打印出扩展名,看看它们是否是有意义的字符串。

    【讨论】:

      【解决方案3】:

      您的代码中有几个问题。

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

      试试

        std::vector<std:string> extensions;
      

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

      【讨论】:

      • 是的,我同意你的最佳做法。
      【解决方案4】:

      您认为availableExtensions 丢失的数据是正确的,其中包含的实际数据在函数getExtensions() 返回调用者后立即被删除(由于超出范围)。

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

      您的代码的简单解决方案是使用std::string,它基本上为您做同样的事情。因此,您唯一需要做的就是将矢量定义从 std::vector&lt;const char*&gt; 更改为 std::vector&lt;std::string&gt;

      如果您正在寻找更有效的解决方案,请在将数据插入向量时使用 std::vector&lt;std::unique_ptr&lt;std::string&gt;&gt; 的向量并进行以下更改

      extensions.push_back(std::make_unique&lt;std::string&gt;(extension.extensionName));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-01
        • 2021-03-06
        • 2019-01-12
        • 2011-03-19
        • 2019-03-10
        • 2012-04-17
        相关资源
        最近更新 更多