2010-03-12 11 views

उत्तर

40

free स्मृति कि p अंक के पुनःआवंटन जाएगा - बस NULL को यह बताए नहीं (और इस प्रकार आप एक स्मृति होगा होगा रिसाव)।

यह है कि यह free करने के लिए कॉल के बाद NULL करने के लिए अपने सूचक आवंटित करने के लिए अच्छा अभ्यास है, के रूप में यह गलती से मुक्त कर दिया स्मृति (जो अभी भी संभव है तक पहुँचने का प्रयास करने से रोकने जाएगा, लेकिन पूरी तरह से नहीं किया जाना चाहिए उल्लेख योग्य है)।

+5

सी में, एक सूचक वास्तव में एक मूल्य की तरह एक मूल्य है। जब आप इसे '=' के साथ मानों पर सेट करते हैं तो सचमुच ऐसा होता है कि यह उस मान के रूप में सेट हो जाता है, दृश्यों के पीछे ऐसा कुछ भी नहीं होता है। – matt

9

सी में कोई कचरा संग्रह नहीं है, इसलिए यदि आप स्पष्ट रूप से स्मृति का एक हिस्सा मुक्त नहीं करते हैं, तो यह कभी भी मुक्त नहीं होगा, भले ही इसका कोई संदर्भ न हो। हो सकता है कि आप कचरा एकत्रित भाषाओं में पृष्ठभूमि से आते हैं, इसलिए आपके विचारों को बदलने में मुश्किल हो सकती है, लेकिन सी

उम्मीद है कि निम्न स्तर की भाषाओं में सभी संसाधनों को मैन्युअल रूप से मुक्त करना याद रखना हमेशा महत्वपूर्ण है। या मदद करता है चीयर्स

+1

जब तक आप एक कचरा कलेक्टर स्थापित नहीं करते हैं, v) – Potatoswatter

7

पी सूचक है (स्मृति में गतिशील रूप से आवंटित एक ब्लॉक करने के लिए [ "ढेर पर"])
इसका मतलब है कि पी एक चर जो एक विशेष खंड की स्मृति में पता होता है (कुछ विशेष आकार, उदाहरण में एक ब्लॉक 10 पूर्णांक रखने के लिए पर्याप्त बड़ा है)।

free(p); मेमोरी मैनेजमेंट लॉजिक (सी रनटाइम) को निर्देशित करता है कि पहले ब्लॉक द्वारा कब्जा कर लिया गया स्मृति जो पी पॉइंट्स का पुन: उपयोग किया जा सकता है।

p = NULL; पी को एनयूएलएल का मान सेट करता है (जिस पते में पहले निहित है वह खो गया है) लेकिन स्मृति में ब्लॉक को भी ध्यान में रखा जाता है।

कुछ भ्रम हो सकता है क्योंकि जावा, सी #, पायथन इत्यादि जैसी भाषाओं में केवल परिवर्तक को एनयूएलएल (या उस मामले के लिए दूसरे पते पर) असाइन करना, स्वचालित रूप से अंतर्निहित स्मृति को मुक्त कर देगा (इस पर कोई अन्य संदर्भ नहीं है पता अन्य लाइव चर में मौजूद है)।

यह, सी या C++ मामला नहीं है जैसे निम्न त्रुटियों को प्रेरित किया:

free(p); 
    // possibly some some code etc. 
    // later: 
    p[6] = 'a'; // <<--- Ouch we're modifying whatever new variable is there !!! 

या

// didn't call free(p) 
    p = NULL; 
    // now the memory allocated for p is held in memory even though it 
    // is not going to be used (assuming no copies of p or of pointers to part 
    // of that block were made. 

उत्तरार्द्ध मामले संसाधनों का केवल बेकार है, पूर्व करने के लिए नेतृत्व कर सकते हैं बग खोजने के लिए मुश्किल है।

इसलिए एक ठेठ सी मुहावरा है:

free(p); 
    p = NULL; 
2

नहीं मुक्त बुला और सीधे शून्य करने के लिए बताए के रूप में दूसरों के द्वारा समझाया एक स्मृति रिसाव के लिए नेतृत्व करेंगे। मेमोरी लीक और अन्य मेमोरी संबंधी समस्याओं के बारे में स्पष्ट विवरण प्राप्त करने के लिए आप इस link का उल्लेख कर सकते हैं।

1

आबंटित स्मृति मुक्त यह deallocates और अनुमति देता है कि स्मृति कहीं और इस्तेमाल किया जा रहा है, जबकि जहां स्मृति आवंटित किया गया था संरक्षित है सूचक।

शून्य करने के लिए आबंटित स्मृति के लिए सूचक की स्थापना यह पुनःआवंटन नहीं करता है।

आप एक कार्यान्वयन, एक ढेर आधारित malloc, डिबग कुछ है कि आवंटित का उपयोग करता है का उपयोग करता है और स्मृति को मुक्त कर देते, और कुछ है कि, आवंटित का उपयोग करता है करने के लिए भी ऐसा ही है, और शून्य करने के लिए याद करने के लिए सूचक सेट का उपयोग कर रहे हैं।

मेमोरी मैनेजमेंट (http://en.wikipedia.org/wiki/Malloc#Implementations देखें) कार्यान्वयन पर निर्भर है।

1

बेहतर तरीका पहले स्मृति मुक्त और उसके बाद शून्य करने के लिए यह निर्धारित करने के लिए है:

free(p); 
p = NULL; 
1

1.

int *p; p= (int *) malloc(10*sizeof(int)); free(p);

स्मृति वापस ढेर करने के लिए जारी किया गया है। लेकिन सूचक अभी भी मुक्त स्मृति स्थान की ओर इशारा करते हैं। इस प्रकार यदि इसका आगे उपयोग किया जाता है, तो मेमोरी भ्रष्टाचार तक पहुंच जाएगा। ऐसा करने के लिए

इस प्रकार सही बात को स्पष्ट रूप से शून्य पर कि सूचक के आगे उपयोग से बचने के लिए सूचक को रीसेट कर रहा है।

अपने टाइप करने के लिए सी

2.

int *p; p=(int *)malloc(10*sizeof(int)); p=NULL;

में एक स्मृति रिसाव यह परिणाम होगा में वापसी सूचक डाली उचित नहीं: के रूप में आवंटित स्मृति यहाँ मुक्त नहीं है । आप पॉइंटर को न्यूल पर रीसेट कर रहे हैं।

0

p=NULL स्मृति पुनःआवंटन नहीं करता है। यदि आपको p द्वारा इंगित स्मृति का उपयोग करने की आवश्यकता नहीं है तो आपको free() का उपयोग करना चाहिए अन्यथा स्मृति रिसाव होगी। भविष्य में फिर से उस स्मृति को गलती से एक्सेस करने से बचने के लिए आपको free() पर कॉल करने के बाद p=NULL भी सेट करना चाहिए।

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

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