Я конвертирую QFile в FILE * для использования некоторых библиотек третьей части. Вот код:Сбой при удалении QTemporaryFile
QTemporaryFile pack200_file;
//Here write something into pack200_file
......
pack200_file.seek(0);
int handle_in = pack200_file.handle();
if (handle_in == -1)
{
qCritical() << "Error reopening " << pack200_file.fileName();
return false;
}
FILE * file_in = fdopen(handle_in, "r");
if(!file_in)
{
qCritical() << "Error reopening " << pack200_file.fileName();
return false;
}
QTemporaryFile qfile_out;
if(!qfile_out.open())
{
qCritical() << "Error opening " << qfile_out.fileName();
return false;
}
int handle_out = qfile_out.handle();
if (handle_out == -1)
{
qCritical() << "Error opening " << qfile_out.fileName();
return false;
}
FILE * file_out = fdopen(handle_out, "w");
if (!file_out)
{
qCritical() << "Error opening " << qfile_out.fileName();
return false;
}
try
{
unpack_200(file_in, file_out);
}
catch (std::runtime_error &err)
{
qCritical() << "Error unpacking " << pack200_file.fileName() << " : " << err.what();
return false;
}
//success
QString finalJarname = .....;
QFile::remove(finalJarname);
QFile::copy(qfile_out.fileName(), finalJarname);
fclose(file_in);
fclose(file_out);
qfile_out.remove(); //Here I got crash
pack200_file.remove();
return true;
я получил аварию на линии qfile_out.remove();
, кажется операция Устранить причину этого. Но я ничего не получил от стека трассировки и визуальной студии, не говоря уже о том, какой код запускает крах в конце концов.
Если изменить код в:
fclose(file_in);
fclose(file_out);
qfile_out.setAutoRemove(false);
pack200_file.setAutoRemove(false);
qfile_out.close();
pack200_file.close();
return true;
также будет сбоить при возвращении;
Тогда я меняю IDE в QtCreator, он сказал:
Второй шанс Assertion Ошибка: Файл F: \ дд \ vctools \ элт \ crtw32 \ lowio \ close.c, линия 47
Выражение: (_osfile (СПЧ) & FOPEN)
Но я не могу найти файл f:\dd\vctools\crt\crtw32\lowio\close.c
. Как я могу локализовать источник сбоя?
Вы закрыли файл qfile_out для него с помощью fclose(). Похоже, что библиотеке среды Visual C это не понравилось, отсюда исключение. Предложите удалить вызовы fclose ... или избежать смешивания операций с Qt и не-Qt-файлами. –
@HamishMoffatt remove fclose() не работает, удалите оба fclose и удалите также сбой при возврате. Я не хочу их смешивать, но библиотека третьей части не написана Qt. – zzy
@HamishMoffatt Я удаляю код QFile и использую только FILE, проблема решена, plz отправит ваш ответ, и я его приму. – zzy