我已经编写了如下定义的 API。此 API 用于在文件系统中查找文件名的索引。文件系统通过 mtp 来自 Android 设备。我正在做的是请求存储在 Android 设备上的文件列表,并将列出的每个文件与我正在寻找的文件进行比较“name2look”
我已经创建了一个 vector 表来存储我正在做的事情,但这不是强制性的。我担心的是变量 name2look 包含我正在寻找“图片”的正确名称
uint32_t USBDevice::GetIndexFromName(LIBMTP_mtpdevice_t *dev, uint32_t storage,const char *name2look)
{
uint32_t idx_fold = 1;
std::vector<MyFileTreeItem*> FSimage;
LIBMTP_file_t *files;
LIBMTP_file_t *file;
std::cout << "NAME : " << name2look << "\n";
files = this->GetFileAndFolder(dev, storage,0);
file = files;
while (file != NULL) {
MyFileTreeItem* FSitem = new MyFileTreeItem();
FSitem->filename = file->filename;
FSitem->index = file->item_id;
FSitem->FileType = file->filetype;
FSimage.push_back(FSitem);
std::cout << "NAME : " << name2look << "\n";
std::cout << "FS NAME : " << file->filename << "\n";
if(std::strcmp(file->filename, name2look)==0) {
std::cout << "FIND IDX : " << file->item_id << "\n";
return file->item_id;
}
file = file->next;
}
return 0;
}
日志显示第一个显示“std::cout”正常。变量名称仍然是“图片”,但是当我要求在“while”之后显示它时,变量 name2look 发生变化并且不再相同。
第一次展示 名称 : 图片 一会儿第二个 姓名:马丁).mp3 FS 名称:音乐
怎么可能被破坏??
该函数由 Qt C++ 代码调用:
void MyButtonGroup::buttonClick(QAbstractButton *button)
{
uint32_t status;
QList<QTreeWidgetItem *> itemList;
uint32_t index = 0;
if (button->text() == "Create Folder") {
itemList = this->MyTree->selectedItems();
QString str = itemList[0]->text(0);
char *utf8_text = str.toLatin1().data();
if(utf8_text != NULL)
{
std::cout << "A CHERCHER " << utf8_text << "\n";
index = this->MyDevice.GetIndexFromName(this->dev_id, storage->id, utf8_text);
}
else
index = 0;
CreateFolderDialog *dialog = new CreateFolderDialog(this->MyTree, this->MyDevice, this->dev_id, this->storage, index);
dialog->show();
}
utf8_text 报告正确的值。
有什么想法吗?
最佳答案
这可能是问题所在。我不知道。检查一下。
这一行:
char *utf8_text = str.toLatin1().data();
文档说 toLatin1()
做什么?它创建一个新的 QByteArray
对象,然后你调用 data()
并得到一个指向字符的指针,然后 QByteArray 在结束时被销毁行,因为它是临时的。
现在您有一个指向已释放内存的无效指针,然后您将其传递给您的函数。它可能会在您的函数中第一次调用 new()
时被覆盖。
我认为你应该把它改成这样:
QByteArray latin_str = str.toLatin1();
char *utf8_text = latin_str.data();
你的名字 utf8_text
很奇怪,因为你刚刚将它转换为不是 UTF8 的 Latin1。
关于c++ - 无需任何直接操作的变量更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27088049/