2013-03-25 4 views
11

पर क्रैश करता है, मैं इसे 2 घंटों के लिए डिबग कर रहा हूं, और यह इससे उबाल जाता है। अगर मैं QString::toStdStringक्यूस्ट्रिंग :: toStdString() std :: स्ट्रिंग विनाशक

QString s = "testtesttesttesttesttest"; 
const std::string &temp = s.toStdString(); 

फोन कार्यक्रम बाद में std :: स्ट्रिंग नाशक

__CLR_OR_THIS_CALL ~basic_string() 
    { // destroy the string 
    _Tidy(true); // <---- It crashes on this line. 
    } 

पर दुर्घटनाओं मैंने सोचा कि यह पहली बार में स्मृति भ्रष्टाचार था, लेकिन ऐसा होता है, भले ही main() केवल उन 2 पंक्तियां हैं। क्या कोई जानता है कि ऐसा क्यों होता है, और मैं इसे कैसे ठीक कर सकता हूं?

मेरा क्यूटी संस्करण 4.8.1 है।

+0

क्यूटी किस संस्करण का उपयोग कर रहे हैं? क्या होता है यदि किसी संदर्भ के बजाय आप स्ट्रिंग 'स्ट्रिंग temp = s.toStdString();' की एक प्रति संग्रहीत करते हैं? – RedX

+0

वही बात 'स्ट्रिंग temp = s.toStdString();' के साथ होती है; ', यह पहले ऐसा होता है क्योंकि' toStdString() 'द्वारा लौटाए गए अस्थायी चर के विनाशक को तुरंत कॉल किया जाता है। मैं क्यूटी का संस्करण कैसे देख रहा हूं जिसका उपयोग मैं कर रहा हूं? मैं कहां देखूं परियोजना अन्य लोगों द्वारा स्थापित की गई है, मुझे क्यूटी निर्माता के साथ केवल विजुअल स्टूडियो के साथ क्यूटी का उपयोग करने का अनुभव नहीं है। – sashoalm

+1

इसे आज़माएं: 'std :: string stdUtf8 = qs.toUtf8()। ConstData();' – Najzero

उत्तर

8

आपके क्यूटी डीएलएल को एसटीएल समर्थन और बिल्कुल उसी सी-रनटाइम लाइब्रेरी के साथ आपके कोड के रूप में संकलित करने की आवश्यकता है। ऐसा लगता है कि आप एक ही समय में दो अलग-अलग सीआरटी का उपयोग कर रहे हैं, जो आपके कार्यक्रम द्वारा उपयोग किए गए ढेर में क्यूटी द्वारा एक ढेर पर बनाए गए वस्तुओं को नष्ट कर देगा।

निर्भरता वॉकर के साथ डीएलएल उपयोग की जांच करें!

+0

मैंने अपने .exe और QtCored4.dll दोनों को खोला लेकिन मुझे यकीन नहीं है कि क्या देखना है। उनके पास भरोसेमंद निर्भरता है।मुझे कैसे पता चलेगा कि वे अलग-अलग सीआरटी का उपयोग कर रहे हैं? अलग-अलग नाम, या कुछ और? – sashoalm

+0

बस यह सुनिश्चित करें कि आपने उसी कंपाइलर के साथ Qt संकलित किया है जिसका उपयोग आप अपने एप्लिकेशन के लिए कर रहे हैं। यह भी सुनिश्चित करें कि आप डीबग और रिलीज मिश्रण नहीं कर रहे हैं। – drescherjm

+0

निर्भरता वॉकर ("प्रोफाइलिंग") से अपना आवेदन शुरू करें और देखें कि कितने एमएस-सीआरटी लोड किए गए हैं। यदि एक से अधिक हैं, तो आपके पास परेशानी में भाग लेने की संभावना है। – Jens

0

मैंने समस्या को अलग तरीके से निपटने का प्रयास किया। मैंने विजुअल स्टूडियो से एक नई परियोजना बनाई, और टेस्ट कोड वहां क्रैश नहीं हुआ। WinMerge के साथ * .vcproj फ़ाइलों के बीच मतभेदों की जांच करने पर, मैंने पाया कि क्रैश इस परियोजना में कुछ कस्टम बदलावों के कारण होता है - आपने अनुमान लगाया - रनटाइम लाइब्रेरीज़। यह न्यूनतम मतभेद का कारण दुर्घटना reproduced किया जा करने के साथ WinMerge द्वारा बनाई पैच है:

112c112 
<    RuntimeLibrary="3" 
--- 
>    RuntimeLibrary="1" 
126a127,128 
>    LinkLibraryDependencies="true" 
>    UseLibraryDependencyInputs="false" 
127a130,131 
>    IgnoreAllDefaultLibraries="false" 
>    IgnoreDefaultLibraryNames="msvcrtd.lib" 
0

सबसे संभावित कारण हो सकता है कि आपके रनटाइम लायब्रेरी "मल्टी पिरोया (/ एमटी)" है और आप को बदलने की जरूरत यह "मल्टी-थ्रेडेड डीएलएल (/ एमडी)" (यदि आप रिलीज संस्करण पर हैं)

यदि आप "बहु-थ्रेडेड डीबग (/ एमटीडी)" से "बहु-थ्रेडेड डीबग" में डीबग संस्करण परिवर्तन में हैं, डीएलएल (/ एमडीडी) "

यदि आपके पास क्यूटी का अजीब संकलन है, तो समाधान विपरीत होना चाहिए।

आप "विन्यास गुण> C/C++ -> कोड पीढ़ी> रनटाइम लायब्रेरी" पर पाएंगे कि

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