2013-10-23 7 views
5

मैं एक बड़े पाश में बार-बार एक फ़ंक्शन चलाने की कोशिश कर रहा हूं लेकिन मुझे 2 या 3 पुनरावृत्तियों के बाद एक त्रुटि मिलती है, लेकिन अगर मैं बिंदु से शुरू करता हूं तो यह एक त्रुटि देता है यह ठीक काम करता है लेकिन फिर 3 के बाद बंद हो जाता है 4 पुनरावृत्ति। यह एक स्मृति समस्या हो सकती है। चूंकि समारोह काफी बड़ा है, मुझे यकीन नहीं है कि वास्तव में स्मृति रिसाव कहां है। क्या वैसे भी मैं प्रत्येक पुनरावृत्ति के बाद चर को मुक्त कर सकता हूं या कुछ ऐसा जो इस समस्या को हल कर सकता है। या चूंकि यह एक लिंक्ड सूची मेमोरी समस्या है सभी लिंक की गई सूची या कुछ मुफ्त? समाधान क्या हो सकता है? Problrm तब नहीं होता है जब मैं एक बार फ़ंक्शन चलाता हूं तो मुझे लगता है कि ऐसा इसलिए है क्योंकि मैं फ़ंक्शन को बार-बार लूप में कॉल कर रहा हूं। क्या इस समस्या के समाधान का कोई तरीका है?glibc का पता लगाएं छोटे-छोटे लिंक की गई सूची दूषित

**glibc detected:.....malloc():smallbin double linked list corrupted: 0x000000000 1d404c0 *** 

उत्तर

18

पुस्तकालय है कि स्मृति मेटाडाटा भ्रष्ट है आप कह रहा है त्रुटि है। यह केवल स्मृति रिसाव से नहीं होगा, आपको अमान्य सूचक को लिखना था। या तो आप सीमाओं से बाहर सूचकांक के लिए लिखा था या इसे मुक्त करने के बाद आप पॉइंटर को लिखा था।

इस तरह की समस्या को डीबग करने का सबसे आसान तरीका valgrind का उपयोग कर रहा है। यह केवल लिनक्स के तहत काम करता है, लेकिन आप पहले से ही इसका उपयोग कर रहे हैं। यह धीमा है, क्योंकि यह प्रोग्राम को सिंगल-स्टेप करता है और हर मेमोरी-एक्सेसिंग निर्देश की जांच करता है, लेकिन यह अमान्य मेमोरी एक्सेस को पकड़ सकता है और अनियमित चर और मेमोरी लीक का भी बहुत भरोसेमंद उपयोग कर सकता है।

duma (detect unintended memory access) लाइब्रेरी भी है। इसे अन्य प्लेटफार्मों पर काम करने के लिए भी बनाया जा सकता है और थोड़ा तेज़ है, लेकिन यह अधिक स्मृति का उपयोग करता है।

और जीसीसी का mudflap है जिसे विशिष्ट कंपाइलर विकल्पों द्वारा सक्रिय किया जा सकता है। उसे सबसे अधिक जीसीसी लक्ष्यों पर काम करना चाहिए, लेकिन मुझे यकीन नहीं है कि सी ++ समर्थन कितना पूरा है।

+0

मुझे अपने प्रोग्राम के विभिन्न हिस्सों में एक ही त्रुटि मिल रही है, इसलिए मुझे यह नहीं पता कि त्रुटि कहां है, मैं valgrind का उपयोग करने की कोशिश करूंगा। धन्यवाद। – user1583647

+0

@ user1583647: भ्रष्टाचार आमतौर पर छद्म-यादृच्छिक और मानक लाइब्रेरी केवल वास्तव में होने के बाद इसे लंबे समय तक पहचानता है। लेकिन जब अमान्य पहुंच होती है तो वालग्रिंड पकड़ सकता है। –

+0

प्रोग्राम की मानक लाइब्रेरी के अलावा प्रोग्राम की मेमोरी लीक या मेमोरी समस्याओं को पाने का कोई तरीका है? – user1583647

0

चेतावनी: बहुत विशिष्ट उपयोग के

मैं क्यूटी के साथ लिखा है, जहां मैं एक वस्तु QObject कि एक प्रति निर्माता था से प्राप्त होने वाले संकेत उपयोग कर रहा था एक आवेदन के भीतर इस समस्या थी।

warning: base class ‘class QObject’ should be explicitly initialized in the copy constructor [-Wextra] 

यह बदल जाता है बाहर है कि QObject व्युत्पन्न वस्तुओं are not supposed to be copied, लेकिन मैं त्रुटि इस तरह का कारण करने के लिए मेरी QObject व्युत्पन्न वर्ग पर प्रतिलिपि निर्माता उम्मीद नहीं थी: मैं किसी भी तरह संकलन के दौरान निम्नलिखित चेतावनी की अनदेखी।

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