2009-05-26 13 views
8

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

struct A { 
    A() x_(NULL) {} 

    ~A() { 
    delete x_; 
    } 

    void Foo() { 
    HugeThingy* x_ = new HugeThingy(); 
    x_->Bar("I. Need. Garbage. Collection. Now."); 
    } 

    HugeThingy* x_; 

    DISALLOW_COPY_AND_ASSIGN(A); // Macro to prevent copy/assign. 
} 
+1

कई लोगों ने उल्लेख किया है कि आपको केवल सूचक और गतिशील आवंटन के बजाय एक सादा स्ट्रिंग ऑब्जेक्ट का उपयोग करना चाहिए - और वे सही हैं। यदि (जैसा कि मुझे संदेह है) तो आप वास्तव में जानना चाहते हैं कि संकलक को आपको चेतावनी देने के लिए कैसे प्राप्त करें जब आप एक स्थानीय चर घोषित करते हैं जो सदस्य चर को छुपाता है, तो मैं आपके प्रश्न को स्पष्ट करने का सुझाव दूंगा। –

+3

जैसा कि आपके पास सदस्य चर के रूप में सूचक है, कृपया प्रतिलिपि बनाने वाला और असाइनमेंट ऑपरेटर प्रदान करना याद रखें। –

+2

यदि उन्हें प्रदान नहीं करते हैं, तो कम से कम डिफ़ॉल्ट को दबाएं। –

उत्तर

24

उपयोग -Wshadow।

वैसे, न तो -W न ही -Wall सक्षम बनाता है -Wadow।

यह संकलक मदद से बचने के इस तरह की समस्या के लिए अच्छा है, लेकिन यह भी आवश्यक नहीं होगा यदि आप सम्मेलनों कि पहली जगह में इसे बनाने से बचने में मदद, सदस्य चर के लिए प्रपत्र x_ के इस तरह के आरक्षण के नाम का इस्तेमाल, स्थानीय चर नहीं।

+2

+1। आपने * वास्तविक प्रश्न पूछे जाने पर भी उत्तर दिया! –

+0

ऐसा प्रतीत होता है कि ओपी के पास ऐसा सम्मेलन है, लेकिन वास्तव में "x_ =" के बजाय "xo =" टाइप किया गया है और "स्ट्रिंग * x_ =" टाइप किया गया है। –

+2

आईएमएचओ, यह आपके संपादक को स्थानीय और सदस्य चर को हाइलाइट करने के लिए कहीं बेहतर है क्योंकि नाम पर एक हंगेरी वार्ट जोड़ना है। – rmeador

5

FWIW मुझे यह समस्या नहीं होगी क्योंकि मैं स्थानीय चर से सदस्य डेटा को अलग करने के लिए नामकरण सम्मेलन का उपयोग करता हूं: मेरे सदस्य डेटा पहचानकर्ताओं को हमेशा m_ के साथ उपसर्ग किया जाता है। a_ तर्क d_ डेटा सदस्य s_ स्थिर फ़ाइल

में वर्ग F_ स्थिर डेटा में डेटा ... और स्थानीय चर के लिए कोई मस्सा -

+1

+1, बहुत आम सम्मेलन। –

+0

निजी सदस्य कार्यों के लिए यह असामान्य सम्मेलन भी नहीं है। यह एक दूसरे में निजी और स्पष्ट रूप से पकड़ने में मदद करता है। – mloskot

+1

और कोड पर काम करने वाले किसी ने कभी भी कॉपी और पेस्ट एरर नहीं बनाया है? वाह। – danio

0

हम नामों की शुरुआत पर इन मौसा का उपयोग करें।

वास्तव में, लाकोस पुस्तक आपका मित्र है।

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