【问题标题】:unallocation and copy failed even if allocation works即使分配有效,取消分配和复制也会失败
【发布时间】:2015-01-13 20:33:35
【问题描述】:

我目前正在开发一个 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 抱怨我无法发送对象

有什么想法吗?

【问题讨论】:

  • QByteArray(filename_stripped).data();返回的指针立即失效,所以你的程序是未定义的。使用变量,而不是临时对象。
  • 我做了一些改变。但为什么它变得无效?
  • 它变得无效,因为拥有它指向的数据的QByteArray对象在你将指针分配给任何东西之前就被破坏了。

标签: c++ qt mtp


【解决方案1】:

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

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

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

由于using freed pointer results in an undefined behavior,这也可能是您第二个问题的原因。

【讨论】:

    猜你喜欢
    • 2013-09-26
    • 2011-02-11
    • 2014-12-31
    • 2017-06-14
    • 1970-01-01
    • 2022-11-06
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    相关资源
    最近更新 更多