2012-07-31 11 views
7

मैंने देखा कि valgrind में मेमोरी लीक में वर्गीकृत किया बाइट्स:वेलग्रिंड वैध "संभवतः खो" उदाहरण के

  • निश्चित रूप से
  • परोक्ष रूप से खो दिया
  • संभवतः
  • अभी भी पहुंचा जा सकता खो खो
  • दबा

मैंने बस एक रिसाव तय किया जहां "संभवतः खो गया" मुख्य समस्या थी।

documentation says: "संभवतः खो मतलब है कि आपका कार्यक्रम, स्मृति लीक कर रहा है जब तक आप संकेत दिए गए है कि उन्हें एक आवंटित ब्लॉक के बीच में बात करने के लिए पैदा कर सकता है के साथ असामान्य कार्य कर रहे होते हैं, कुछ संभव के लिए उपयोगकर्ता के मैनुअल देखना का कारण बनता हैसंकेत दिए गए है कि उन्हें एक आवंटित ब्लॉक के बीच में बात करने के लिए पैदा कर सकता है के साथ असामान्य काम करने ""

मैं का एक उदाहरण कृपया ज्ञात हो कि मई "?

मेरा मतलब एक उदाहरण है जहां "संभवतः खोया" अनदेखा किया जा सकता है हालांकि यह वालग्रिंड द्वारा रिपोर्ट किया जाता है। एक उदाहरण है, जिसमें संकेत के उपयोग valgrind बनाता शिकायत लेकिन एक ही समय में है कि रास्ते में संकेत के उपयोग किसी भी तरह वैध है

आप

उत्तर

7

के कुछ उदाहरण क्या प्रलेखन अलग पुस्तकालय हैं धन्यवाद कि अपने स्वयं के आवंटकों के पास है और जिसके लिए स्मृति वापस आती है वह सीधे अंतर्निहित ओएस आवंटक (मॉलोक/एसआरबीके) द्वारा लौटाई गई सूचक नहीं है, लेकिन ऑफसेट के बाद एक सूचक है। उदाहरण के लिए विचार करें, एक आवंटक जिसने कुछ अतिरिक्त मेमोरी और संग्रहीत मेटा जानकारी प्राप्त की है (शायद कचरा कलेक्टर के लिए जानकारी टाइप करें ...)।

void* allocate(size_t size) { 
    metainfo_t *m = (metainfo_t*) malloc(size + sizeof(metainfo)); 
    m->data = some_value; 
    return (void*)(m+1);   // [1] 
} 
void deallocate(void* p) { 
    metainfo_t *m = ((metainfo_t*)p) - 1; 
    // use data 
} 
void * memory = allocate(10); 

जब valgrind स्मृति ट्रैक कर रहा है, यह मूल सूचक है कि malloc द्वारा दिया गया था याद है, और है कि सूचक कार्यक्रम में कहीं भी संग्रहीत नहीं है: आवंटन और आवंटन रद्द करने की प्रक्रिया के लिए समान होगा। लेकिन इसका मतलब यह नहीं है कि स्मृति लीक हो गई है, इसका मतलब केवल यह है कि सूचक सीधे कार्यक्रम में उपलब्ध नहीं है। विशेष रूप से memory में अभी भी लौटा हुआ पॉइंटर है, और deallocate इसे रिलीज़ करने के लिए बुलाया जा सकता है, लेकिन valgrind प्रोग्राम में कहीं भी (char*)memory - sizeof(metadata_t) स्थान पर मूल लौटा हुआ पॉइंटर नहीं देखता है और चेतावनी देता है।

5
char *p = malloc(100); 
if (p != 0) 
{ 
    p += 50; 
    /* at this point, no pointer points to the start of the allocated memory */ 
    /* however, it is still accessible */ 
    for (int i = -50; i != 50; i++) 
     p[i] = 1; 
    free (p - 50); 
} 
2
char *p = malloc(100); 
if (p != 0) 
{ 
    p += 50; 
    /* at this point, no pointer points to the start of the allocated memory */ 
    /* however, it is still accessible */ 
    for (int i = -50; i != 50; i++) 
     p[i] = 1; 
    free (p - 50); 
} 

चूंकि यह बहुत रोचक लग रहा है, इसलिए मैंने कोड चलाया और इसे खराब किया। नतीजा निम्नलिखित है।

[email protected]:~$ valgrind test 
==14735== Memcheck, a memory error detector 
==14735== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. 
==14735== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info 
==14735== Command: test 
==14735== 
==14735== 
==14735== HEAP SUMMARY: 
==14735==  in use at exit: 0 bytes in 0 blocks 
==14735== total heap usage: 32 allocs, 32 frees, 2,017 bytes allocated 
==14735== 
==14735== All heap blocks were freed -- no leaks are possible 
==14735== 
==14735== For counts of detected and suppressed errors, rerun with: -v 
==14735== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 6) 

यह कहता है कि कोई रिसाव संभव नहीं है। क्या मुझे कुछ याद आ रही है?

+0

कृपया टिप्पणी के रूप में टिप्पणी दें, उत्तर के रूप में नहीं। StackOverflow उनके उत्तरों पर टिप्पणियों के उपयोगकर्ताओं को सूचित करता है, लेकिन अन्य उपयोगकर्ताओं के उपयोगकर्ताओं को सूचित नहीं करता है (और नहीं) जो एक ही प्रश्न का उत्तर देते हैं। उस ने कहा ... – hvd

+0

... कोड स्मृति को मुक्त करने के समाप्त होता है, इसलिए valgrind इसे नहीं देखता है।जिस बिंदु को मैं बना रहा था वह यह था कि यदि कार्यक्रम 'मुक्त' तक पहुंचने से पहले निकलता है (या बस बिल्कुल मुक्त नहीं होता है), और 'p' सेट रहता है, तो वाल्ग्रिंड आवंटित स्मृति को संभावित रूप से खोने पर विचार करेगा। परीक्षण करते समय, 'पी' सेट रहने के लिए, आपको वैश्विक स्तर पर 'पी' भी बनाना पड़ सकता है। – hvd

+0

मैंने इसे टिप्पणियों के रूप में पोस्ट करने का प्रयास किया, लेकिन टिप्पणियों में चरित्र सीमा की संख्या है। उसके लिए माफ़ करना। – jaeyong

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