删除QTemporaryFile时崩溃

时间:2015-07-16 01:46:50

标签: c++ qt file qfile

我将QFile转换为FILE *以使用某些第三方库。这是代码:

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,它说:

  

第二次机会断言失败:文件   f:\ dd \ vctools \ crt \ crtw32 \ lowio \ close.c,第47行

     

表达式:( - osfile(fh)&amp; FOPEN)

但我找不到文件f:\dd\vctools\crt\crtw32\lowio\close.c。 我如何本地化崩溃的来源?

1 个答案:

答案 0 :(得分:1)

您使用fclose()关闭了qfile_out的文件。看起来Visual C运行时库并不喜欢它,因此是例外。建议您删除对fclose的调用...或避免混合Qt和非Qt文件操作。