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

时间:2012-09-10 17:31:42

标签: qt destructor quazip

在Qt Creator中(qt 4.8,winxp)我写了

QuaZip* zipfile = new QuaZip;
zipfile->setZipName("myzipfile.zip");
zipfile->open(QuaZip::mdUnzip);

if(zipfile->isOpen()){
  QStringList files = zipfile->getFileNameList();
}   // here the error occurs

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

  

Debug Assertion失败!

     

表达式:_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
...

qlist.h中的第433行是调试器停止的地方:

while (from != to) --to, reinterpret_cast<T*>(to)->~T();

只有当我调用:: getFileNameList()时才会出现错误,如果我填写列表手册就可以了。 使用quazip工作的其他操作,我可以解压缩和压缩数据,只有getFileNameList会造成麻烦。

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

1 个答案:

答案 0 :(得分:1)

这意味着您正在将释放模式Qt DLL与Debug调制混合。您必须创建2组Quazip DLL,一组用于Release模式,另一组用于Debug模式。您不能将Qt Debug DLL与Release DLL混合使用。