gpt4 book ai didi

c++ - 即使分配有效,取消分配和复制也会失败

转载 作者:行者123 更新时间:2023-11-28 02:34:37 24 4
gpt4 key购买 nike

我目前正在开发一个 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 发生时, destroy 发生了。一些数据分配在genfile上。

  1. 我现在可以打开 PTP 统计文件,提示我无法发送对象

有什么想法吗?

最佳答案

问题出在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 释放了s 的析构函数,因此出现错误。

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

关于c++ - 即使分配有效,取消分配和复制也会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27931001/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com