【发布时间】:2015-07-16 01:46:49
【问题描述】:
我将 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(); 行遇到了崩溃,看来是删除操作导致的。但是我从跟踪堆栈中一无所获,Visual Studio 没有提到我最终是哪个代码触发了崩溃。
如果我把代码改成:
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) & FOPEN)
但我找不到文件f:\dd\vctools\crt\crtw32\lowio\close.c。
如何定位崩溃的根源?
【问题讨论】:
-
您使用 fclose() 关闭了 qfile_out 的文件。看起来 Visual C 运行时库不喜欢这样,因此出现了异常。建议您删除对 fclose... 的调用或避免混合使用 Qt 和非 Qt 文件操作。
-
@HamishMoffatt remove fclose() 不起作用,同时删除 fclose 和 remove 在返回时也会崩溃。我确实不想混合它们,但是第三方库不是由 Qt 编写的。
-
@HamishMoffatt 我删除了 QFile 代码,只使用 FILE,问题解决了,请发表你的答案,我会接受。