我已经编写了如下定义的API。此API用于查找文件系统中文件名的索引。文件系统来自Android设备通过mtp。我正在做的是请求存储在Android设备上的文件列表,并将列出的每个文件与我正在寻找的'name2look'进行比较
我已经创建了一个向量表来存储我正在做的事情,但这不是强制性的。我担心的是变量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;
}
Log显示第一个显示'std :: cout'正常。变量名仍然是'图片'但是当我要求在“while”之后显示它时,变量name2look会改变并且不再相同。
首先显示 名称:图片 第二个在同一时间 姓名: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报告正确的值。
有什么想法吗?
答案 0 :(得分:1)
这个可能是问题。我不确定。看看吧。
这一行:
char *utf8_text = str.toLatin1().data();
文档说toLatin1()
有什么作用?它创建一个新的QByteArray
对象,然后你调用data()
,你得到一个指向字符的指针,然后 QByteArray在该行的末尾被销毁,因为它是TEMPORARY 。
现在你有一个指向释放内存的无效指针,然后你将其传递给你的函数。它可能会被您函数中第一次调用new()
覆盖。
我认为你应该把它改成这样的东西:
QByteArray latin_str = str.toLatin1();
char *utf8_text = latin_str.data();
您的姓名utf8_text
很奇怪,因为您刚刚将其转换为非UTF8的Latin1。