В настоящее время я работаю над приложением 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 не влияет, но только символ . голец необходим, потому что API используется только поддержка char . Я конвертирую QString в char используя следующий код.
char *mtp_wrapper::convertQStr2char(QString str) {
QByteArray latin_str = str.toLatin1();
char *return_str = latin_str.data();
return return_str;
}
У меня есть проблема с выпуском genfile ?? кажется, что среда выполнения считает, что я не могу освободить невыделенный указатель, но я использую это, используя строку ниже:
genfile = LIBMTP_new_file_t ();
LIBMTP_destroy_file_t (genfile);
Для этого нет никаких предварительных условий. когда происходит генерация файла, происходит уничтожение. Некоторые данные размещены в генфайле.
Любая идея ?
Проблема заключается в convertQStr2char()
метод. latin_str
Объект создается в стеке и будет уничтожен в конце блока кода. Этот объект отвечает за управление своими внутренними данными.
Когда вы звоните char *return_str = latin_str.data();
копируешь указатель в latin_str
внутренние данные. Когда ваш метод возвращается, latin_str
разрушен и память, на которую указывает data()
освобожден, так что ваш возвращенный указатель теперь также указывает на свободную память.
LIBMTP_destroy_file_t
задокументировано освободить память, используемую структурой, включая любые строки. В частности, когда вы вызываете его, он также пытается освободить память, на которую указывает FileNameOnly
, но — как я объяснил выше — память уже была освобождена QByteArray
деструктор, отсюда и ошибка.
поскольку использование освобожденного указателя приводит к неопределенному поведению, это может быть также причиной вашей второй проблемы.