C++函数调用后丢失的数据
C++ data lost after function call
我想这是一件非常微不足道的事情,但我被困住了,找不到有什么问题:
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));
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 如何使用模板根据数据类型调用函数?
- C++函数调用后丢失的数据
- 函数调用不起作用,矢量访问数据
- 使用函数调用初始化静态全局数据(在编译时)
- 从数据类型调用构造函数(或任何函数/方法)而不经历两个模板化函数的任何类型的方法
- 解压缩存储为数组(目标:RPC)的可变模板函数调用的数据
- C++ 构造函数/析构函数调用 &对动态创建的数据调用"new"是否会删除旧数据?
- 类成员函数正常工作,但当作为另一个类的数据成员调用时陷入无限循环
- 函数调用中的数据类型没有正确匹配
- 函数调用中的数据类型不匹配