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

В настоящее время я работаю над приложением 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);

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

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

Любая идея?

1 ответ

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

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

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

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

Другие вопросы по тегам