2010-06-08 7 views
10

मैं std :: स्ट्रिंग में संभव मेमोरी लीक के बारे में कई valgrind चेतावनी के साथ एक समस्या है, इस तरह:सी ++ एसडीडी :: स्ट्रिंग पूल, डीबग बिल्ड करता है? std :: स्ट्रिंग और valgrind समस्याओं

120 bytes in 4 blocks are possibly lost in loss record 4,192 of 4,687 
    at 0x4A06819: operator new(unsigned long) (vg_replace_malloc.c:230) 
    by 0x383B89B8B0: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (in /usr/lib64/libstdc++.so.6.0.8) 
    by 0x383B89C3B4: (within /usr/lib64/libstdc++.so.6.0.8) 
    by 0x383B89C4A9: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, unsigned long, std::allocator<char> const&) (in /usr/lib64/libstdc++.so.6.0.8) 

मैं सोच रहा हूँ:

  • करता है std :: स्ट्रिंग (जीसीसी 4.1.2) किसी मेमोरी पूल का उपयोग करें?
  • यदि हां, तो क्या पूल को अक्षम करने का कोई तरीका है (डीबग बिल्ड आदि के रूप में)?

उत्तर

1

120 बाइट पूल के लिए पर्याप्त नहीं हैं। Do you exit() from your program?

+0

नहीं, कोई बाहर निकलें()। तो पूल नहीं होने पर स्मृति संभवतः क्यों खो जाती है? –

6

FAQ पर वर्णित के रूप में इसे दबाया जा सकता है। कंटेनर में "मेमोरी लीक" के बारे में एक अनुभाग है। आप

  • वेलग्रिंड
  • के अपने संस्करण
  • की जाँच करनी चाहिए अपने कार्यक्रम के एक डीबग बिल्ड का उपयोग करें (और अन-अनुकूलित)
  • और GLIBCXX_FORCE_NEW परिभाषित यदि आवश्यक हो तो। अगर मैं सही ढंग से याद है, कई एसटीएल allocators स्मृति की अवधारण के कुछ प्रकार लागू (यह एक वातावरण चर अपने कार्यक्रम के क्रम व्यवहार, नहीं एक संकलन समय #define के रूप में आप उम्मीद कर सकते प्रभावित करता है।)
2

। आईई वे तुरंत आवंटित स्मृति जारी नहीं करते हैं, लेकिन इसे चारों ओर रखें और इसका पुन: उपयोग करें। मेरे एसटीएल कार्यान्वयन द्वारा आवंटित स्मृति से आने वाले वाल्ग्रिंड में निश्चित रूप से कई झूठे सकारात्मक थे।

समस्या से निपटने के लिए मुझे सबसे अच्छा तरीका मिला है (बस) दमन फ़ाइल का उपयोग करने के लिए।

0

मुझे अभी यह समस्या थी और मेरे लिए, ऐसा इसलिए था क्योंकि मैं लाइब्रेरी के विकास संस्करण से जुड़ रहा था, लेकिन मेरा टेस्ट कोड पुराने सिस्टम-स्थापित संस्करण को उठा रहा था। परिवर्तन इतने सूक्ष्म थे कि यह बिना किसी स्पष्ट समस्या के लिंक और चलाएगा, लेकिन वालग्रिंड अजीब रिसाव का पता लगाएगा। valgrind के स्थान पर ldd का उपयोग करके पुष्टि हुई कि यह गलत लाइब्रेरी फ़ाइल को उठा रहा है। LD_LIBRARY_PATH को सही ढंग से ठीक करने के लिए, हालांकि सही समाधान लाइब्रेरी संस्करण को बढ़ाने के लिए है क्योंकि यह स्पष्ट रूप से पीछे की तरफ संगत नहीं है अगर आपको यह हो रहा है।

मैंने यह समस्या भी देखी है जब किसी ऑब्जेक्ट को ठीक से नष्ट नहीं किया गया है, जैसे virtual वाले वर्ग में virtual विनाशक गायब है। जब कक्षा को पॉइंटर-टू-बेस-क्लास में रखा जाता है और फिर नष्ट हो जाता है, केवल बेस क्लास विनाशक चलता है, जो आपके उदाहरण में std::string उदाहरणों जैसे व्युत्पन्न कक्षाओं में आवंटित कुछ भी लीक करता है। यहां संकेत दिया गया था कि कौन सी कक्षा लीक string का उपयोग कर रही थी, और क्लास पदानुक्रम को बेस क्लास पर वापस ले जाएं और पुष्टि करें कि इसमें एक स्पष्ट virtual विनाशक, यहां तक ​​कि एक खाली भी है। मुझे लगता है कि अगर वे virtual कक्षा में काम करते हैं तो जाहिर है, लेकिन जीसीसी आपको इसके बारे में चेतावनी नहीं देता है, तो वे अनुमान लगा रहे थे।

0

मुझे यह समस्या थी क्योंकि मेरा प्रोग्राम बिना किसी अपवाद के समाप्त हो गया था। स्पष्ट रूप से बेकार अपवादों के लिए हैंडलर सबकुछ साफ नहीं करता है।

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