c++ - 无需任何直接操作的变量更改

标签 c++ qt

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

相关文章:

c++ - 在 Qt 中从字符串中提取参数,包括引用区域

c++ - 使用 bigint 类 C++

c++ - 无法计算字符类型的数量

c++ - 在QT中将线的一端放在圆上

windows - 如何为 Qt 独立应用程序创建 list 文件

c++ - 我如何使用 C++ 获得微秒和纳秒的两个时间间隔之间的差异

c++ - posix_fallocate 是否适用于以追加模式打开的文件?

c++ - 如何使 C++ 类对 gdb 友好?

c++ - 打印 3D vector

c++ - 我如何编辑QCombobox的当前文本?