2013-02-19 50 views
7

मैं कोड में एक स्मृति रिसाव समस्या का सामना कर रहा हूँ, इसके चल रहा है, जबकि ढेर अधिकतम करने के लिए बढ़ रही है पर चला जाता है और मैं सेवा को पुनः आरंभ करने की जरूरत है, मैं शीर्ष कमान भाग गया और देखते ढेर बढ़ता जा रहा है कि जब भी im में एक परिदृश्य लागू सर्विस।valgrind सशर्त कूद या चाल uninitialised मूल्य (रों) पर निर्भर करता है, यह संकेत मिलता है स्मृति रिसाव?

मैं valgrind साथ सेवा भाग गया,

valgrind --log-file=log-feb19.txt --leak-check=full --show-reachable=yes --track-origins=yes myservice 

मैं किसी भी निश्चित रूप से खो दिया है या संभवतः खो ब्लॉक देखने जबकि iam परिदृश्यों चल donot लेकिन मैं सशर्त कूद या चाल का एक बहुत कुछ देख uninitialised मूल्य पर निर्भर करता है (रों) त्रुटियों।

एक स्मृति रिसाव के लिए इन गिनती है?

मैं क्या मिल रहा है का उदाहरण:

==27278== Conditional jump or move depends on uninitialised value(s) 

==27278== at 0xC90D91E: xcsFreeMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so) 

........

==27278== Uninitialised value was created by a heap allocation 

==27278== at 0x4A078B8: malloc (vg_replace_malloc.c:270) 

==27278== by 0xC90E32F: xcsGetMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so) 

कर सकते हैं किसी को मदद करते हैं।

+0

क्या आपको सही उत्तर मिला है? यदि यह है, तो कृपया एक को सही के रूप में चिह्नित करें। – logoff

+0

[पिनपॉइंटिंग "सशर्त कूद या चाल का संभावित डुप्लिकेट अनियमित मूल्य (ओं)" वालग्रिंड संदेश] पर निर्भर करता है (http://stackoverflow.com/questions/2612447/pinpointing-conditional-jump-or-move-depends-on-uninitialized -values-valgrin) –

उत्तर

15

नहीं, यह मतलब है कि आप स्मृति है कि आरंभ नहीं किया गया एक्सेस कर रहे हैं:

int main() 
{ 
    int unitialized; 
    std::cout << unitialized << std::endl; 
} 

यह त्रुटि उत्पन्न होगी।

थोड़ा अधिक आम होगा:

struct X 
{ 
    X() : i(42) { } 
    private: 
    int i; 
    int* forgotten; // oops, not initialized 
}; 

अंत में, यह अक्सर, malloc आधारित कोड के साथ होता है आप memset का उपयोग नहीं करते जब पूरे बफर स्पष्ट करने के लिए। तो,

  1. malloc एक बफर आकार मीटर
  2. (उदा एक सॉकेट से) n एक फाइल करने के लिए
  3. लिखने मीटर बाइट्स बाइट्स; (एम-एन) बाइट्स
+0

मैं मानता हूं कि यह स्मृति रिसाव को इंगित नहीं करता है, लेकिन चूंकि यह अपरिभाषित व्यवहार का आह्वान करता है, इससे कुछ भी हो सकता है –

1

कोई भी स्मृति स्मृति रिसाव को इंगित नहीं करता है। हालांकि एक गैर initialized चर पर निर्भर करता है व्यावहारिक रूप से कुछ भी पैदा हो सकती है एक सशर्त कूद रही है। सामान्य रूप में अप्रारंभीकृत चर का उपयोग करना अपरिभाषित व्यवहार का आह्वान।

+2

सी में, एक अनियमित वस्तु का उपयोग करके अपरिभाषित व्यवहार नहीं है। यह केवल यूबी है यदि ऑब्जेक्ट "रजिस्टर 'के साथ घोषित किया जा सकता था, अगर उसका पता कभी नहीं लिया जाता है। एक सूचक के माध्यम से अनियंत्रित स्मृति पढ़ना पूरी तरह से ठीक है (उस पीओवी से)। यह ऐसे मूल्यों पर शाखा है जो वाल्ग्रिंड सही मायने में शिकायत करता है। –

4

यह खंड 4.2.2. Use of uninitialised values में, वेलग्रिंड प्रयोक्ता मैनुअल में समझाया गया है:

जब अपने कार्यक्रम के एक मूल्य जो initialised नहीं किया गया है का उपयोग करता है एक uninitialised-मूल्य उपयोग त्रुटि रिपोर्ट किया गया है - दूसरे शब्दों में, है अपरिभाषित।

...

यह समझना महत्वपूर्ण है कि अपने कार्यक्रम जितना आसपास कबाड़ (uninitialised) डेटा कॉपी कर सकते हैं के रूप में यह पसंद करती है महत्वपूर्ण है। Memcheck इस का अवलोकन करता है और डेटा का ट्रैक रखता है, लेकिन शिकायत नहीं है। एक शिकायत केवल तब जारी की जाती है जब आपका प्रोग्राम अनियंत्रित डेटा का उपयोग इस तरीके से करने का प्रयास करता है जो आपके प्रोग्राम के बाहरी दृश्यमान व्यवहार को प्रभावित कर सकता है।