c++ - 删除 QTemporaryFile 时崩溃

标签 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(); 行崩溃,似乎是删除操作导致的。但是我从跟踪堆栈中什么也没得到,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,它说:

Second Chance Assertion Failed: File f:\dd\vctools\crt\crtw32\lowio\close.c , Line 47

Expression: (_osfile(fh) & FOPEN)

但是我找不到文件f:\dd\vctools\crt\crtw32\lowio\close.c。 如何定位崩溃源?

最佳答案

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

关于c++ - 删除 QTemporaryFile 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31444078/

相关文章:

c++ - 尝试从点 unsigned char 获取数据时出现段错误

c++ - boost::signal slot_type 模板

c++ - :-1: error: Automatic patching failed at C:\QtSDK\Symbian\SDKs\Symbian1Qt473\bin\createpackage. 第 357 行

php - 文件创建时间

java - Camel pollEnrich 第二次没有工作

c++ - 友好的 cin 和重载操作符 >>

c++ - "Forward-unbreakable"访问器类模板 [C++]

Python:捕获 QListWidget 中的重新排序事件?

c++ - Qt显示透明动画gif

javascript - 从内存加载图像并显示