变更无需任何直接操作

时间:2014-11-23 10:42:03

标签: c++ qt

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

有什么想法吗?

1 个答案:

答案 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。