2012-09-10 49 views
1

Qt Creator中(QT 4.8,WINXP)投下的錯誤,我寫了QStringList中:: getFileNameList通過破壞

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

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

當文件被破壞,一個消息說

調試斷言失敗!

表達式:_CrtIsValidHeapPointer(pUserData)

在調試我有以下功能堆棧:在qlist.h

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 
... 

線433,其中調試器停止:

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

僅當我調用:: getFileNameList()時發生錯誤,如果我填充列表手冊,它工作正常。 其他使用quazip工作的操作,我可以解壓和壓縮數據,只有getFileNameList會造成麻煩。

編輯:我找到了原因:我使用的quazip1.dll是它的發佈版本,只有在調試運行時出現這個問題。所以,如果我使用調試quazip.dll,它工作正常。令人討厭的是它們被稱爲相同的,所以每次我從調試切換到發佈時都必須重新命名。任何人都知道這個解決方法?

+0

不知道這可能會導致崩潰(甚至編譯),但這看起來不正確:「QuaZip zipfile;」裏面的if。你已經將zipfile進一步聲明爲QuaZip *,所以刪除第二個zipfile變量。 –

+0

哦謝謝,但那只是一個「錯字」,我糾正了它。問題仍然存在。 – cad

回答

1

這意味着您正在將發佈模式Qt DLL與調試版本混合使用。您必須創建兩套Quazip DLL,其中一套用於發佈模式,另一套用於調試模式。您不能將Qt調試DLL與發佈DLL混合使用。