2010-04-21 13 views
10

मेरे पास एक std :: map < std :: string, std :: string> जो कुछ एपीआई कॉल के साथ शुरू हुआ है। जब मैं इस मानचित्र का उपयोग करने की कोशिश कर रहा हूं तो मुझे सेगमेंटेशन गलती मिल रही है। मैं अमान्य कोड का पता कैसे लगा सकता हूं या अमान्य या कोई विवरण जो मुझे समस्या को ठीक करने में मदद कर सकता है? कोड इस तरह दिखता है:वालग्रिंड का उपयोग करके विभाजन गलती विवरण का पता लगाने के लिए कैसे?

std::map< std::string, std::string> cont; 

some_func(cont); // getting parameter by reference and initialize it, someone corrupted memory (cont) inside this function 

std::cout << cont[ "some_key" ] << '\n'; // segmentation fault here, cannot access "some_key" 
+0

'cont' एक ग्लोबल ऑब्जेक्ट कन्स्ट्रक्टर में पहुंचने वाला वैश्विक नहीं होगा? –

+0

@ डेविट: बीटीडब्ल्यू, आप हर समय या फिर जवाब स्वीकार करना चाहेंगे। सभी को यह बताएं कि आपकी समस्या का हल किस जवाब से एसओ समुदाय का एक महत्वपूर्ण पहलू है। –

+0

ठीक है मैं ठीक –

उत्तर

3

आम तौर पर मुझे यकीन नहीं है कि यह लाइन सीईजी गलती कैसे उत्पन्न कर सकती है: ब्रैकेट ऑपरेटर हमेशा एक std :: स्ट्रिंग (आवश्यक होने पर खाली एक बना देगा) वापस लौटाएगा और इसे हमेशा प्रिंटिंग के लिए मान्य होना चाहिए।

क्या यह संभव है कि इसके बजाय, आप जिस कॉल स्टैक को देखते हैं वह निष्पादित करने के लिए अगली पंक्ति पर इंगित कर रहा है और यह some_func में मर रहा है? हम इसके लिए कोड नहीं देखते हैं, इसलिए मैं यह नहीं कह सकता कि यह समस्या पैदा कर सकता है या नहीं।

वैकल्पिक रूप से some_func नक्शा में तारों को शुरू करने के लिए char * (temp std :: string invokes) का उपयोग कर some_func है? यह संभव है कि यह उस समय में एक अमान्य स्ट्रिंग पेश कर सकता है जो थोड़ी देर के लिए "काम करने के लिए होता है" लेकिन जब कुछ_फनक लौटाता है तो यह प्रिंट अच्छी तरह से बातचीत नहीं करता है।

2

आप वाक्य रचना के साथ अपने आवेदन (डिबग मोड में संकलित) का शुभारंभ:

valgrind yourapp 

वेलग्रिंड आप जहां विभाजन गलती हुई की आईएसपी नामों को दिखायेगी। इसके बाद यह पता लगाने के लिए कि क्या हुआ और इसे सही करने के लिए आप पर निर्भर है।

आपके कोड में, वाल्ग्रिंड की परवाह किए बिना, मैं जांचता हूं कि cont[ "some_key" ] आपके सेगफॉल्ट का सबसे अधिक संभावित कारण यह है कि लौटा हुआ मूल्य कुछ जंगली सूचक है या बिल्कुल शुरू नहीं हुआ है। यदि ऐसा है तो इसे cont["some_key"][0] जैसे किसी भी सेगमेंटेशन गलती का कारण बनने का प्रयास करें।

एक और विचार: आपके मानचित्र में स्ट्रिंग कुंजियों के बारे में क्या? क्या यह संभव है कि उनमें से कुछ चुपचाप (कोई अपवाद नहीं) कुंजी के रूप में उपयोग की जाने वाली स्ट्रिंग के डेटा हिस्से को आवंटित करने में विफल रहे। Std :: map एक हैश टेबल नहीं है लेकिन केवल कुछ ऑर्डर किए गए कंटेनर हैं। एक कुंजी खोजते समय इसे अन्य चाबियों तक पहुंचने की आवश्यकता हो सकती है और वहां हो सकता है। जांच करने के लिए है कि आप आप नक्शे में कुछ भी नहीं पहुँच सकते हैं, तो यदि समस्या विशेष रूप से "some_key" के साथ होता है देखने के लिए अपने नक्शे और इस शो की सामग्री (सभी कुंजी पर पुनरावृति करने की कोशिश या कर सकते हैं।

तुम भी एक unordered_map अगर साथ की कोशिश कर सकते अपने कार्यक्रम यदि व्यवहार ही है को देखने के लिए आदेश देने सेट some_func(cont) पंक्ति में एक ब्रेकपाइंट की जरूरत नहीं है।

+0

कोड को फिर से देखने के बारे में लिखूंगा, मैंने इसे अपडेट किया है, नई टिप्पणियां जो समस्या का वर्णन करना चाहिए –

0

valgrind के अलावा, आप क्रम में एक डिबगर का उपयोग कर अपने समस्या पर ध्यान केंद्रित करने की कोशिश कर सकते।

, और जांच यदि cont एक वैध संदर्भ है।

इसके अलावा, पास है आपने सोचा कि cont["some_key"] वापस आ रहा है अगर कुछ_की मौजूद नहीं है?

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