2012-08-14 36 views
5

उद्धरण:के एंड आर से एक वाक्य की शुद्धता के बारे में अनिश्चित - पॉइंटर अंकगणित | प्रक्रिया मुक्त

परीक्षण अगर (allocbuf + ALLOCSIZE - allocp> = एन) { चेकों हो, तो पर्याप्त जगह n पात्रों के लिए एक अनुरोध को पूरा करने के लिए। यदि वहां है, allocp का नया मान Allocbuf के अंत से अधिकतर होगा।

कोड है जो इसे से संबंधित है:

#define ALLOCSIZE 10000 /* size of available space */ 
static char allocbuf[ALLOCSIZE]; /* storage for alloc */ 
static char *allocp = allocbuf; /* next free position */ 

char *alloc(int n) 
/* return pointer to n characters */ 
{ 
    if (allocbuf + ALLOCSIZE - allocp >= n) { /* it fits */ 
     allocp += n; 
     return allocp - n; /* old p */ 
    } else 
/* not enough room */ 
     return 0; 
} 
void afree(char *p) /* free storage pointed to by p */ 
{ 
    if (p >= allocbuf && p < allocbuf + ALLOCSIZE) 
     allocp = p; 
} 

तो यह कैसे allocbuf में अंतिम स्थिति से बाहर हो सकता है? मेरी राय में ऑलोकबफ [99 99]

उस से परे कुछ भी है। allocbuf [10000] गलत है और एक स्मृति रिसाव है, क्या मैं सही हूँ?


प्रश्न के दूसरे भाग - मैं हालांकि इसके नाम के अनुसार afree समारोह एक सरणी में विशेष स्थानों पर बचाया मूल्य हटा रहा है कि। हालांकि, जैसा कि मैं देख सकता हूं कि यह सिर्फ "कुछ रिकॉर्डिंग हेड" को सरणी के बाईं ओर कुछ स्थानों पर ले जाता है? वहां सहेजा गया डेटा छूटा रहता है।

+0

+1। – perilbrain

+1

यदि 'allocp' 'allocbuf [10000]' को इंगित करता है, तो इसका मतलब है कि भंडारण पूरी तरह से उपयोग किया जाता है (अंतिम टुकड़ा बिल्कुल' n' प्रविष्टियां थी) और इसलिए बाद में 'आवंटन') '0' वापस आ जाएगा। उद्धरण यह नहीं कहता कि इस "अवैध" सूचक का उपयोग करने की अनुमति है, और यह वास्तव में 'alloc()' से वापस नहीं आ गया है। – evnu

+2

एफवाईआई, जो आपके लिए आवंटित स्मृति से अधिक है, एक स्मृति रिसाव नहीं है। एक मेमोरी रिसाव आवंटित स्मृति का ट्रैक खो रहा है ताकि आप बाद में उस स्मृति को मुक्त नहीं कर सकें। –

उत्तर

5

allocp हमेशा अंतिम मुक्त मेमोरी स्थिति को इंगित करना चाहिए, लेकिन जब कोई स्मृति स्थिति मुक्त नहीं होती है तो यह allocbuf के अंत से एक होगी।

स्थिति पर विचार करें जब बफर में केवल एक ही मेमोरी सेल छोड़ा जाता है: allocpallocbuffer[9999] पर इंगित करेगा क्योंकि यह अंतिम निःशुल्क मेमोरी सेल है। अब जब आप समारोह कॉल alloc(1) परीक्षण कर

allocbuf + ALLOCSIZE - allocp >= n 

के रूप में यह जब से तुम एक char आवंटित करने के लिए कोशिश कर रहे हैं और वहाँ वास्तव में एक char बाईं चाहिए सच वापस आ जाएगी। फिर आखिरी मेमोरी स्थिति आवंटित की जाएगी। अब allocbuf - allocp == ALLOCSIZE और allocbuf के अंत से बाहर है। लेकिन उस मामले में उपर्युक्त परीक्षण हमेशा झूठी वापसी करेगा और इस प्रकार allocbuf के दायरे से परे कोई स्मृति कभी भी एक्सेस नहीं की जाएगी।


afree के बारे में अपने प्रश्न के बारे में: स्मृति malloc द्वारा लौटाए का प्रारंभिक मूल्य अनिर्धारित रहता है। इसका मतलब है कि आप इसके बारे में कभी भी कोई धारणा नहीं कर सकते हैं और उपयोग से पहले इसे ओवरराइट करना होगा। इसलिए afree आपको जो भी लगता है उसके विपरीत किसी भी डेटा को हटाना नहीं है। यह पूरी तरह से ठीक है क्योंकि यह अब उपयोग में नहीं है और भविष्य के आवंटन के लिए उपलब्ध है।

एक तरफ ध्यान दें कि malloc नामक एक समारोह बहुत ही calloc है जो अनुरोधित मेमोरी ब्लॉक आवंटित करने के बाद इसे शून्य पर प्रारंभ करता है।

+1

किसी सरणी के अंत से पहले तत्व को पॉइंटर की अनुमति है। – ecatmur

+0

@paldepind - बहुत बहुत धन्यवाद! क्या आप मुफ्त प्रक्रिया के बारे में दूसरे भाग का जवाब भी दे सकते हैं? –

+0

आपका स्वागत है! मैंने जवाब अपडेट कर लिया है। – paldepind

2

अपने प्रश्न के दूसरे भाग के बारे में: afree() तरह स्मृति प्रबंधन कार्यों या C पुस्तकालय free() नहीं आम तौर पर शून्य या स्पष्ट स्मृति है। वे इसे पुन: उपयोग के लिए उपलब्ध कराते हैं। यह अच्छा है क्योंकि आप प्रदर्शन लागत का भुगतान नहीं करते हैं। दुर्भाग्यवश, यह आपके द्वारा अब तक की स्मृति का उपयोग करने जैसी बग मास्क कर सकती है।

कुछ हीप मैनेजर सुरक्षा कारणों से या डिबगिंग में सहायता के लिए free() पर कॉल करते समय इसे स्मृति मान या शून्य मान सकते हैं। यह मानक द्वारा आवश्यक नहीं है और आपको विशेष रूप से इस व्यवहार को सक्षम करना होगा। खोज के लिए