0

我目前正在开发一个mac应用程序,将文件从mac传输到mtp设备,如usb。

我使用下面的代码来添加它:

LIBMTP_file_t *genfile;

char *AbsolutePath = NULL;
char *FileNameOnly = NULL;

QFileInfo fileInfo(filename);

FileNameOnly = convertQStr2char(fileInfo.fileName());
AbsolutePath = convertQStr2char(fileInfo.absoluteFilePath());

genfile = LIBMTP_new_file_t();

genfile->filesize = filesize;
genfile->filename = FileNameOnly;
genfile->filetype = file_type;
genfile->parent_id = CurrentFolderID;
genfile->storage_id = PulsDeviceMngr->devicestorage->id;

if ((genfile->filetype != LIBMTP_FILETYPE_ALBUM) && (genfile->filetype != LIBMTP_FILETYPE_PLAYLIST)) {
    ret = LIBMTP_Send_File_From_File(PulsDeviceMngr->device, AbsolutePath, genfile, ProgressBar, NULL);
    if (ret != 0) {
        qDebug() << "Error sending file";
        LIBMTP_Dump_Errorstack(PulsDeviceMngr->device);
        LIBMTP_Clear_Errorstack(PulsDeviceMngr->device);
    } else {
        PulsDeviceMngr->devicestorage->FreeSpaceInBytes -= filesize;
        PulsDeviceMngr->devicestorage->FreeSpaceInObjects--;
    }
}
LIBMTP_destroy_file_t(genfile);

这基本上是 mtp 使其工作所需的。

我正在使用 QT/C++ 来开发软件。

似乎 QString 没有受到影响,而只有 char 。需要char,因为使用的 api 仅支持 char 。我正在使用以下代码将 QString 转换为 char 。

char *mtp_wrapper::convertQStr2char(QString str) {
    QByteArray latin_str = str.toLatin1();
    char *return_str = latin_str.data();
    return return_str;
}
  1. 我在发布 genfile 时遇到问题??似乎运行时认为我无法释放未分配的指针,但我使用以下行来执行此操作:

    genfile = LIBMTP_new_file_t(); LIBMTP_destroy_file_t(genfile);

没有先决条件。当 genfile 发生时,销毁发生了。在 genfile 上分配了一些数据。

  1. 我现在可以打开 PTP stat 的文件,抱怨我无法发送对象

任何想法 ?

4

1 回答 1

2

问题出在convertQStr2char()方法上。该latin_str对象在堆栈上创建,并将在封闭代码块的末尾被销毁。该对象负责管理其内部数据。

当您调用 时,您只需将指针char *return_str = latin_str.data();复制到的内部数据。当您的方法返回时,被销毁并且指向的内存被释放,因此您返回的指针现在也指向已释放的内存。latin_strlatin_strdata()

LIBMTP_destroy_file_t 被记录为释放结构使用的内存,包括任何字符串。特别是,当您调用它时,它还会尝试释放 指向的内存FileNameOnly,但是 - 正如我上面解释的 - 内存已被QByteArray的析构函数释放,因此出现错误。

由于使用释放的指针会导致未定义的行为,这也可能是您的第二个问题的原因。

于 2015-01-13T23:47:00.593 回答