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

时间:2017-03-27 20:36:29

标签: c++ function memory vector

我想这是非常微不足道的事情,但我已经陷入困境,无法找到错误:

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 *,一旦执行该函数就会删除它,对吧?如果是这种情况,如何将字符串保存在向量中?

谢谢!

4 个答案:

答案 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));