2012-05-30 7 views
5

कभी कभी मैं इस डिबग मोड में मेरी क्यूटी परियोजना (image) चल रहा "डीबग अभिकथन विफल" त्रुटि मिलती है। मुझे नहीं पता कि मैं कहां गलत हूं क्योंकि संकलक कुछ भी नहीं कहता है और मुझे नहीं पता कि मेरी त्रुटि खोजने के लिए क्या करना है।डीबग अभिकथन में विफल: _CrtIsValidHeapPointer (pUserData)

मैं क्यूटी निर्माता 2.4.1, क्यूटी 4.8.1 का उपयोग कर विंडोज विस्टा के तहत प्रोग्राम।

मेरे कार्यक्रम एक लेजर उपकरण से कुछ जानकारियां पढ़ सकते हैं और एक कोड इस के समान के साथ एक फ़ाइल में उन्हें बचाने के लिए है:

void runFunction() 
{ 
    configure_Scanning(...); 

    while(...) 
    { 
     // do something 
     scanFunction(); 
     // do something 
    } 
} 

और यह मेरा "दोषी" समारोह है (मैं कहाँ लगता है कि समस्या है)

void scanFunction() 
{ 
    file.open(); 

    data = getDataFromDevice(); 

    if(flag) 
    { 
     if(QString::compare(lineB,"")!=0) 
     { 
      QTextStream out(&file); 
      out << lineB << endl; 
      lineB = ""; 
     } 
     lineA.append(data+"\t"); 
    } 
    else 
    { 
     if(QString::compare(lineA,"")!=0) 
     { 
      QTextStream out(&file); 
      out << lineA << endl; 
      lineA = ""; 
     } 
     lineB.prepend(data+"\t"); 
    } 

    file.close(); 
} 

कहाँ लीनिया और lineB शुरू में दो शून्य QString हैं: विचार यह है कि मैं (एक द्विदिश स्कैनिंग एक 2D मैट्रिक्स में जानकारियां को बचाने के लिए इधर-उधर कर एम-एक्स से + एक्स और वाइसवर्सा, जबकि वाई निर्दिष्ट लक्ष्य पर जाता है)। लाइन ए (-) से (+) पढ़ने को याद करता है; लाइन बी (+) से (-) पढ़ने को याद करता है। जब स्कैनिंग दिशा बदलती है, तो मैं फ़ाइल में लाइन ए (या लाइन बी) लिखता हूं और मैं स्कैनिंग के साथ आगे बढ़ता हूं।

क्या आप समझते हैं कि मैंने क्या कहा? क्या आप मुझे समाधान सुझा सकते हैं?

धन्यवाद और मेरी अंग्रेजी के लिए खेद है: पी

+2

प्रोग्राम को डीबग करने के लिए संवाद में पुनः प्रयास करें, जैसा कि यह कहता है। फिर कॉल स्टैक की जांच करें या इसे इस प्रश्न में जोड़ें और आपको गलत क्या हो रहा है इसका बेहतर विचार प्राप्त करना चाहिए। एक sidenote पर, एक फ़ाइल को लगातार खोलने और बंद करने की शायद आवश्यकता नहीं है और कुछ ओवरहेड का कारण बनता है। – stijn

+0

मुझे पता है कि प्रत्येक चरण पर एक फ़ाइल खोलना और बंद करना सबसे अच्छी रणनीति नहीं है, लेकिन मुझे अप्रत्याशित बाधा के मामले में डेटा के किसी भी नुकसान को रोकने के लिए ऐसा करना है। –

+0

यह नहीं है कि 'फ्लश() 'क्या करता है? – stijn

उत्तर

10

_CrtIsValidHeapPointerUserData का मतलब है, तो आप एक ढेर भ्रष्टाचार है, जो डिबग ढेर चेकर द्वारा देखा जाता है है। उन सभी को संदेह करें जो किसी भी हटाए गए गतिशील वस्तु में कोई जानकारी लिख सकते हैं। और हां, आपको फिर से लिखने पर ढेर निर्देश नहीं मिलेगा, लेकिन अगली ढेर जांच पर, जो किसी भी अगली मेमोरी आवंटन/डीलोकेशन पर किया जाएगा। हालांकि एकल थ्रेडेड अनुप्रयोगों में कॉल स्टैक द्वारा ट्रैक किया जाना चाहिए।

+0

मैंने यह नहीं कहा कि "मेरा" क्यूटी निर्माता मुझे डीबगर के साथ एप्लिकेशन चलाने की अनुमति नहीं देता है। तो मैं रनटाइम पर कोई त्रुटि नहीं देख सकता। क्या आप मुझे ढेर की जांच कैसे कर सकते हैं? –

+0

वास्तव में नहीं कह सकता है।ब्रूट फोर्स तरीका स्मार्ट पॉइंटर वर्गों के साथ सभी पॉइंटर्स को प्रतिस्थापित करना है और जब समस्या का पता चला है तो उन्हें त्रुटि संदेशों को आग लगाना है। – Forgottn

+0

अच्छा विचार! लेकिन ... मुझे नहीं पता कि समस्या कब पता चलती है। वैसे भी, मैं इस तरह से कोशिश करूंगा। विचार के लिए धन्यवाद! –

संबंधित मुद्दे