2013-07-13 8 views
7

"संभावित रूप से खोए गए" की वाल्ग्रिंड मेमोरी लीक रिपोर्ट के बारे में पढ़ने से, मुझे समझ में आया कि इस तरह की रिपोर्ट एक झूठी-सकारात्मक रिपोर्ट होगी। मुझे समझ में नहीं आया कि यह सामान्य परिस्थितियों पर कोड के लिए बहुत मजबूर किए बिना कैसे हो सकता है।क्या झूठी-सकारात्मक वाल्ग्रिंड "संभावित रूप से खोई गई" रिपोर्ट का एक सरल उदाहरण है?

तो इस विकल्प को समझने के लिए, मैं पूछ रहा हूं कि झूठी सकारात्मक वाल्ग्रिंड "संभावित रूप से खो गया" स्मृति रिसाव रिपोर्ट का एक सरल उदाहरण है?

//get asprintf 
#define _GNU_SOURCE 
#include <stdio.h> 
#include <assert.h> 

char* getFoo() { 
    static char* foo = NULL; 
    if(!foo && asprintf(&foo, "Hello World\n") < 0) assert(0); 
    return foo; 
} 

int main() { 
    printf("%s", getFoo()); 
} 

यह एक ठेठ सिंगलटन ideom है:

class A { 
    int x; 
}; 
class B { 
    int y; 
}; 
class C : public A, B { 
    int z; 
}; 

int main() { 
    static B* notLost = new C(); //The upcast will change the pointer to point 4 bytes into the object, because that is the offset of the B subobject within the C object. 
    //Valgrind thinks, the new object may be possibly unreachable. 
    //But I can still do this: 
// delete (C*)notLost; //The downcast undoes the pointer modification by the upcast. 
} 

यहाँ एक झूठी सकारात्मक की एक अधिक सामान्य उदाहरण है:

उत्तर

1

यहाँ की "संभवतः खो" एक झूठी सकारात्मक का एक उदाहरण है: कहीं एक समारोह है, जो किसी विशेष वस्तु (यहां "हैलो वर्ल्ड" स्ट्रिंग) तक पहुंच प्रदान करता है, यह सुनिश्चित करता है कि कभी भी ऐसी कोई वस्तु उत्पन्न न हो। चूंकि ऑब्जेक्ट को कभी भी नष्ट नहीं किया जाता है/हटा दिया जाता है, इसलिए वालग्रिंड को यह सोचना पड़ता है कि यह एक स्मृति रिसाव है। आम तौर पर इन्हें "अभी भी पहुंच योग्य" के रूप में सूचीबद्ध किया जाता है, क्योंकि स्थिर स्थिर चर है जिसके माध्यम से इसे एक्सेस किया जा सकता है, लेकिन फिर भी यह एक झूठी सकारात्मक है।

+0

क्या "संभावित रूप से खोई गई" रिपोर्ट के मामले में भी एक अच्छा उदाहरण है, क्योंकि मुझे समझ में नहीं आया कि उस मामले में झूठी-सकारात्मक रिपोर्ट कैसे हो सकती है? – user2579277

+0

@ user2579277: क्षमा करें, मैं जल्द ही प्रतिक्रिया नहीं दे सका, मैंने अब एक और प्रत्यक्ष उदाहरण जोड़ा है। – cmaster

+0

मुझे खेद है, लेकिन संभवतः खोने के लिए आपका नया उदाहरण एक वाल्ग्रिंड रिपोर्ट में समस्या के रूप में नहीं दिखता है। और दूसरे उदाहरण के लिए, एस्प्रिंट इसके मूल में स्मृति आवंटित करता है ताकि वाल्ग्रिंड रिपोर्ट झूठी सकारात्मक न हो। – user2579277

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