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