Qt quazip::getFileNameList的QStringList通过销毁来强制转换错误

Qt quazip::getFileNameList的QStringList通过销毁来强制转换错误,qt,destructor,quazip,Qt,Destructor,Quazip,在QtCreator(Qt4.8,winxp)中,我写道 当文件被销毁时,一个消息框显示 调试断言失败 表达式:_CrtIsValidHeapPointer(pUserData) 在调试器中,我有以下函数堆栈: 0 DbgBreakPoint ntdll 0x7c90120e 1 RtlpBreakPointHeap ntdll 0x7c96c201 2 RtlpValidateHeapEntry ntdll 0x7c96c63e

在QtCreator(Qt4.8,winxp)中,我写道

当文件被销毁时,一个消息框显示

调试断言失败

表达式:_CrtIsValidHeapPointer(pUserData)

在调试器中,我有以下函数堆栈:

0   DbgBreakPoint   ntdll       0x7c90120e  
1   RtlpBreakPointHeap  ntdll       0x7c96c201  
2   RtlpValidateHeapEntry   ntdll       0x7c96c63e  
3   RtlValidateHeap ntdll       0x7c9603b0  
4   HeapValidate    kernel32        0x7c85f8d7  
5   _CrtIsValidHeapPointer  dbgheap.c   2103    0x102d1ac9  
6   _free_dbg_nolock    dbgheap.c   1317    0x102d0b3a  
7   _free_dbg   dbgheap.c   1258    0x102d09e0  
8   free    dbgfree.c   49  0x102d8990  
9   qFree   qmalloc.cpp 60  0x5e2f1d    
10  QString::free   qstring.cpp 1235    0x65dd22    
11  QString::~QString   qstring.h   880 0x5ac0d3    
12  QString::`scalar deleting destructor'   QuizSet     0x4120e0    
13  QList<QString>::node_destruct   qlist.h 433 0x412180    
14  QList<QString>::free    qlist.h 759 0x4115fb    
15  QList<QString>::~QList<QString> qlist.h 733 0x410967    
16  QStringList::~QStringList   MyApp       0x414d9f    
17  MyApp::myFunction   myapp.cpp   561 0x420e1c
...
0 DbgBreakPoint ntdll 0x7c90120e
1 RTLPC堆ntdll 0x7c96c201
2 RtlpValidateHeapEntry ntdll 0x7c96c63e
3 RtlValidateHeap ntdll 0x7c9603b0
4 HeapValidate内核32 0x7c85f8d7
5_CrtIsValidHeapPointer dbgheap.c 2103 0x102d1ac9
6 _free_dbg_nolock dbgheap.c 1317 0x102d0b3a
7 _free_dbg dbgheap.c 1258 0x102d09e0
8自由dbgfree.c 49 0x102d8990
9 qFree qmaloc.cpp 60 0x5e2f1d
10 QString::free QString.cpp 1235 0x65dd22
11 QString::~QString QString.h 880 0x5ac0d3
12 QString::`scalar deleting destructor'QuizSet 0x4120e0
13 QList::node_destruct QList.h 433 0x412180
14 QList::免费QList.h 759 0x4115fb
15 QList::~QList QList.h 733 0x410967
16 QStringList::~QStringList MyApp 0x414d9f
17 MyApp::myFunction MyApp.cpp 561 0x420e1c
...
qlist.h中的第433行是调试器停止的位置:

while (from != to) --to, reinterpret_cast<T*>(to)->~T();
while(from!=to)---to,重新解释cast(to)->~T();
只有在调用::getFileNameList()时才会发生错误,如果我填写列表手册,它就可以正常工作。 其他操作与quazip工作,我可以解压和压缩数据,只有getFileNameList的麻烦


编辑:我找到了原因:我使用的quazip1.dll是它的发行版,只是在调试运行时出现了这个问题。因此,如果我使用debug quazip.dll,它可以正常工作。恼人的是,它们被称为相同的,所以每次我从调试切换到发布时都必须重命名。有人知道这方面的解决方法吗?

这意味着您将发布模式Qt DLL与调试模式混合使用。您必须创建两组Quazip DLL,一个用于发布模式,另一个用于调试模式。您不能将Qt调试DLL与发布DLL混合使用。

这意味着您将发布模式Qt DLL与调试DLL混合使用。您必须创建两组Quazip DLL,一个用于发布模式,另一个用于调试模式。您不能将Qt调试DLL与发布DLL混合使用。

不知道这会如何导致崩溃(甚至编译),但这看起来是错误的:if中的“QuaZip zipfile;”。您已经将zipfile进一步声明为QuaZip*,因此删除第二个zipfile变量。噢,谢谢,但这只是一个“输入错误”,我更正了它。问题仍然存在。我不知道这会如何导致崩溃(甚至编译),但这看起来是错误的:“QuaZip-zipfile;”在if中。您已经将zipfile进一步声明为QuaZip*,因此删除第二个zipfile变量。噢,谢谢,但这只是一个“输入错误”,我更正了它。问题仍然存在。
while (from != to) --to, reinterpret_cast<T*>(to)->~T();