2015-07-16 6 views
1

Я конвертирую 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. Как я могу локализовать источник сбоя?

+0

Вы закрыли файл qfile_out для него с помощью fclose(). Похоже, что библиотеке среды Visual C это не понравилось, отсюда исключение. Предложите удалить вызовы fclose ... или избежать смешивания операций с Qt и не-Qt-файлами. –

+0

@HamishMoffatt remove fclose() не работает, удалите оба fclose и удалите также сбой при возврате. Я не хочу их смешивать, но библиотека третьей части не написана Qt. – zzy

+1

@HamishMoffatt Я удаляю код QFile и использую только FILE, проблема решена, plz отправит ваш ответ, и я его приму. – zzy

ответ

0

Вы закрыли файл qfile_out для него с помощью fclose(). Похоже, что библиотеке среды Visual C это не понравилось, отсюда исключение. Предложите удалить вызовы fclose ... или избежать смешивания операций с Qt и не-Qt-файлами.