我已经编写了如下定义的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。

08-17 05:42