невыделение и копирование не удалось, даже если распределение работает

В настоящее время я работаю над приложением 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;
}
  1. У меня есть проблема с выпуском genfile ?? кажется, что среда выполнения считает, что я не могу освободить невыделенный указатель, но я использую это, используя строку ниже:

    genfile = LIBMTP_new_file_t ();
    LIBMTP_destroy_file_t (genfile);

Для этого нет никаких предварительных условий. когда происходит генерация файла, происходит уничтожение. Некоторые данные размещены в генфайле.

  1. Теперь я могу открыть файл для PTP stat жалуются, что не могу отправить объект

Любая идея ?

0

Решение

Проблема заключается в convertQStr2char() метод. latin_str Объект создается в стеке и будет уничтожен в конце блока кода. Этот объект отвечает за управление своими внутренними данными.

Когда вы звоните char *return_str = latin_str.data();копируешь указатель в latin_strвнутренние данные. Когда ваш метод возвращается, latin_str разрушен и память, на которую указывает data() освобожден, так что ваш возвращенный указатель теперь также указывает на свободную память.

LIBMTP_destroy_file_t задокументировано освободить память, используемую структурой, включая любые строки. В частности, когда вы вызываете его, он также пытается освободить память, на которую указывает FileNameOnly, но — как я объяснил выше — память уже была освобождена QByteArrayдеструктор, отсюда и ошибка.

поскольку использование освобожденного указателя приводит к неопределенному поведению, это может быть также причиной вашей второй проблемы.

2

Другие решения


По вопросам рекламы [email protected]