2010-07-29 11 views
7

संभव डुप्लिकेट:
Setting variable to NULL after free …क्या यह हमेशा अच्छा() - इनके बाद पॉइंटर्स को न्यूल पर सेट करने के लिए एक अच्छा अभ्यास है?

मैं अच्छी सी प्रोग्रामिंग प्रथाओं और मेरे दोस्त के बारे में सीख रहा हूँ

बताया मुझे हमेशा मुक्त() उन्हें ing (या एक फोन करने के बाद शून्य की ओर इशारा स्थापित करने के लिए विशिष्ट मुक्त समारोह)।

उदाहरण के लिए:

char* ptr = malloc(100); 
... 
free(ptr); 
ptr = NULL; 

या

struct graph* graph = create_graph(); 
... 
destroy_graph(graph); 
graph = NULL; 

क्यों यह एक अच्छा अभ्यास है?

अद्यतन: उत्तर पढ़ने के बाद, यह मेरे लिए एक भयानक प्रथा प्रतीत होता है! मैं संभव डबल-फ्री() त्रुटियों को छुपा रहा हूं। यह संभवतः एक अच्छा अभ्यास कैसे हो सकता है? मैं हैरान हूँ।

धन्यवाद, बोडा साइडो।

+0

@bodacydo पृष्ठ के दाईं ओर स्थित "संबंधित" प्रश्नों पर नज़र डालें। –

+0

धन्यवाद नील और माइकल। वह प्रश्न वास्तव में मेरे प्रश्न का उत्तर देता है। उत्तरों को पढ़ने के बाद मेरे पास एक और सवाल है - क्या न्यूल में पॉइंटर को वास्तव में त्रुटियों को छिपाना नहीं है? डबल फ्री() अब पता नहीं चला है! अब मैं उलझन में हूं क्योंकि यह वास्तव में दिखाए जाने से गलतियों को छुपा रहा है। – bodacydo

+1

कैसे? एक सूचक को मुक्त करना और इसे NULL पर सेट करना स्मृति को मुक्त करने की अनुमति देता है। यदि आप फिर नल मुक्त करने का निर्णय लेते हैं, तो आपको एक जोर या कुछ अन्य चेतावनी मिलनी चाहिए।डबल फ्रीिंग मेमोरी नल मुक्त करने से ट्रैक करने के लिए बहुत कठिन है। –

उत्तर

2

खराब अभ्यास मुझसे मुझसे वोट। यदि आप कोई मान असाइन करना चाहते हैं, तो इसे (शून्य *) 0xdeadbeef पर सेट करें। जांचें कि आपका सीआरटी पहले क्या कर सकता है। एक सभ्य डीबग आवंटक स्मृति को मुक्त करने के लिए एक पैटर्न को मुक्त कर देगा जो पॉम्बटर को मुक्त होने के बाद उपयोग किया जाता है। हालांकि यह गारंटी नहीं है। लेकिन फिर सूचक मूल्य बदलना बेहतर (और तेज़) समाधान है।

-5

मैं हाँ लगता है ...

जब आप menory के एक हिस्से का उपयोग कर समाप्त कर दिया है, हम (मुक्त कर देना चाहिए) है.इस स्मृति कुछ अन्य प्रयोजनों के लिए प्रयोग की जाने वाली मुक्त कर दिया ... आगे malloc की तरह (अनुमति देता है) कॉल।

नि: शुल्क एक तर्क के रूप स्मृति के लिए सूचक लेता है और स्मृति जो करने के लिए सूचक को संदर्भित करता है को मुक्त कर देते ...

आशा इस मदद करता है ... :)

+5

-1: यह प्रश्न का उत्तर नहीं देता है। बोडासीडो नहीं पूछ रहा था, क्या उसे मुक्त स्मृति चाहिए। वह पूछ रहा था, क्या उसे इसे मुक्त करने के बाद पॉइंटर्स को न्यूल पर सेट करना चाहिए। –

6

यह द्वारा एक अच्छा अभ्यास माना जाता है कुछ क्योंकि यह आपको मुफ्त() ed के बाद स्मृति को गलती से एक्सेस करने से रोकता है।

+1

उत्तर पढ़ने के बाद, मुझे यह एक बुरा अभ्यास माना - मैं डबल-फ्री की त्रुटियों को छुपा रहा हूं! यह संभवतः एक अच्छा अभ्यास कैसे हो सकता है? – bodacydo

+1

असल में, यह आपको स्वचालित रूप से इसे एक्सेस करने से नहीं रोकता है, लेकिन आप हमेशा (और चाहिए) नल पॉइंटर्स के खिलाफ जांच सकते हैं, लेकिन आप यह नहीं बता सकते कि कोई नॉन पॉइंटर मान्य है या नहीं। इसलिए यह अच्छा अभ्यास है। – cypheon

+0

मुझे अभी तक विश्वास नहीं है कि यह एक अच्छा अभ्यास है। – bodacydo

13

हालांकि यह चोट नहीं पहुंचा सकता है, यह हमेशा मदद नहीं करता है। विचार करने का मुद्दा यह है कि पॉइंटर की कई प्रतियां होने के लिए यह आसान है और अधिकतर आप केवल एक को एक पूर्ण करने जा रहे हैं। जहां यह बिल्कुल मदद नहीं करता है की क्लासिक उदाहरण है:

void free_graph(graph *g) 
{ 
    ... 
    free(g); 
    g = NULL; // not useful in this context 
} 

समस्या यहाँ है कि आप केवल शून्य पर सूचक है कि free_graph लिए स्थानीय है सेट कर रहे हैं और सूचक free_graph की कॉल करने वाले को आयोजित किया जाता है जाएगा अभी भी इसका मूल मूल्य है।

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