2012-05-30 7 views
5

xxxx.h फ़ाइल में:जीसीसी/लिनक्स: CppuTest स्थिर वैक्टर, झूठी सकारात्मक का उपयोग कर स्मृति रिसाव दिखाता है?

struct dn_instance_pair 
{ 
    std::string theDn; 
    int theInstance; 
}; 
typedef struct dn_instance_pair t_dn_inst_pair; 

struct table_rowid_type 
{ 
    char theTable[101]; 
    sqlite3_int64 theRowid; 
    int operation; 
}; 

// static class members 
static vector<t_dn_inst_pair> dninstList; 
static vector<t_table_rowid_type> tablerowidList; 

xxxx.cpp

// declaration of vectors. 
// Included to this post only for completeness. 
vector<t_dn_inst_pair> xxxx::dninstList; 
vector<t_table_rowid_type> xxxx::tablerowidList; 

ये वाहक स्थिर कॉलबैक कार्यों में नियंत्रित किया जाता है, ताकि वे भी स्थिर होना चाहिए में।

cpputest में, जब इन वैक्टर में से किसी एक में कुछ जोड़ने की कोशिश कर, एक विफलता होता है:

Leak size: 8 Allocated at: <unknown> and line: 0. Type: "new" Content: "<\[email protected]" 

सामान एक सदिश को जोड़ा गया स्वत: चर रहे हैं और यह एक सामान्य समारोह में क्या होता है:

t_dn_inst_pair thePair; 
thePair.theDn = updated_dn; 
thePair.theInstance = updated_instance; 

वेक्टर परीक्षण मामले के अंत में मंजूरी दे दी है:

xxxx::yyyy()->dninstList.clear(); 

(yy

"यह एक झूठी सकारात्मक है: yy() एक सिंगलटन xxxx वस्तु के लिए एक सूचक रिटर्न)

पृष्ठ http://blog.objectmentor.com/articles/2010/02/04/cpputest-recent-experiences स्मृति रिसाव उसी तरह की चर्चा करता है। Esko

इस विफलता वास्तव में एक झूठी सकारात्मक है

br: यह एक बार की आवंटन और सी ++ स्मृति आवंटन और स्थिर प्रारंभ की एक पक्ष प्रभाव है "

तो मेरे सवाल है।?

उत्तर

3

आप valgrind साथ जाँच की है? यह। लीक स्मृति कि है स्मृति से "निश्चित रूप से खो दिया है" कि "अभी भी पहुंचा जा सकता" भेद होगा यदि यह एक झूठी सकारात्मक है यह अभी भी पहुंच योग्य होना चाहिए (सदिश में संकेत के माध्यम से।)

Remembe आर vector::clear() सिर्फ तत्वों को नष्ट कर देता है, यह किसी भी स्मृति को रद्द नहीं करता है, इसलिए capacity() वही रहेगा।

आप अपनी स्मृति पुनःआवंटन के लिए वेक्टर के लिए मजबूर करने की अदला-बदली चाल कर सकता है:

vector<t_dn_inst_pair>().swap(xxxx::yyyy()->dninstList); 

कि एक अस्थायी (खाली) वेक्टर बनाता है और अपने वेक्टर के साथ अदला-बदली, तो अपने वेक्टर के तत्वों और आबंटित स्मृति हो जाएगा अस्थायी में स्थानांतरित कर दिया और फिर बयान के अंत में नष्ट कर दिया।

पीएस सिंगलेट्स चूसते हैं, उनका उपयोग न करें, लेकिन यदि आप एक स्थिर सदस्य हैं तो वे yyyy()->dninstList (यानी operator-> का उपयोग करके) को वेक्टर तक क्यों पहुंचते हैं? आप या तो xxxx::dninstList कह सकते हैं या इसे एक गैर स्थैतिक सदस्य बना सकते हैं और सिंगलटन ऑब्जेक्ट के माध्यम से इसे एक्सेस कर सकते हैं (लेकिन भूलें कि सिंगलेट्स चूसते हैं।)

+0

हाय जोनाथन, आपके उत्तर के लिए धन्यवाद। हाँ, मैंने वालग्रिंड के साथ जांच की; कोई स्मृति रिसाव नहीं है। valgrind --tool = memcheck --leak-check = full --show-reachable = yes ./executable। मैं deallocating के लिए स्वैप चाल जोड़ देंगे। और वैक्टर को गैर स्थैतिक में बदलने की कोशिश करेगा और सिंगलटन के माध्यम से उन्हें एक्सेस करेगा (हालांकि यह बेकार है;)। br Esko –

+3

मुझे विश्वास है कि यह वास्तव में विनाश के आदेश के कारण प्रकट होता है। अर्थात।कि स्मृति वास्तव में मुक्त हो जाती है, केवल CppUTest ने लीक की सूचना दी है। इसका कारण यह है कि 'मुख्य()' फ़ंक्शन रिटर्न के बाद वैश्विक विनाश के दौरान स्थैतिक वस्तुओं को केवल नष्ट कर दिया जाता है (और उनकी याददाश्त मुक्त), लेकिन सीपीपीयूटीएस्ट शायद परीक्षण चालक के अंत में लीक की रिपोर्ट करता है, जिसका अर्थ है कि अभी भी 'मुख्य() ' । यह समझाएगा कि क्यों वालग्रिंड उन्हें दिखाता है - शो-पहुंच योग्य = हाँ। –

+0

हाय जोनाथन, गैर-स्थिर एक आकर्षण की तरह काम किया। मैंने स्वैप भी किया। धन्यवाद ! स्पष्टीकरण के लिए जन को भी धन्यवाद –

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