我已经编写了如下定义的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”之后显示它时,变量名称2look会发生变化,并且不再相同。
首次展示
NAME:图片
一会儿第二
姓名:Martin).mp3
FS NAME:音乐
怎么可能被损坏?
该函数由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()
,并获得一个指向字符的指针,然后创建,因为该行是TEMPORARY ,所以QByteArray在行尾被破坏了。现在,您有一个指向释放内存的无效指针,然后将其传递给函数。您的函数中第一次调用
new()
可能会覆盖它。我认为您应该将其更改为以下内容:
QByteArray latin_str = str.toLatin1();
char *utf8_text = latin_str.data();
您的名字
utf8_text
很奇怪,因为您刚刚将其转换为不是UTF8的Latin1。