2015-08-19 4 views
6

मैंने पुस्तक में सीखा कि अगर मुझे किसी फ़ंक्शन से पॉइंटर वापस करने की आवश्यकता है, तो मैं malloc() का उपयोग करता हूं और ढेर से स्मृति प्राप्त करता हूं। मैं सोच रहा था कि मैं समारोह के बाद आवंटित स्मृति को free() कैसे कर सकता हूं।"स्थानीय समारोह में मॉलोक, मुख्य में मुफ्त मेमोरी" क्या यह ठीक है? कैसे?

क्या यह मेमोरी मुक्त करने के लिए मैंने निम्नलिखित कोड में क्या किया है ठीक है? यदि यह सही नहीं है, तो फ़ंक्शन के बाद मेमोरी मुक्त करने का सही तरीका क्या है?

int *Add_them_up (int *x, int *y) 
{ 
    int *p = (int *) malloc(sizeof (int)); 
    *p = *x + *y; 
    return p; 
} 


int main() 
{ 
    int c = 3; 
    int d = 4; 
    int *presult = NULL; 
    presult = Add_them_up (&c, &d); 
    printf ("the result of adding is:%d\n", *presult); 
    free (presult); 
    return 0; 
} 
+3

कृपया [देखें क्यों नहीं डालना] (http://stackoverflow.com/q/605845/2173917) 'malloc()' और 'C' में परिवार का वापसी मूल्य। –

+0

@shinhwa एक गंभीर समस्या है जिसे आप यहां याद कर रहे हैं। –

+0

@ सौरव घोष आपने मेरे दोस्त को एक गंभीर समस्या को नजरअंदाज कर दिया है। –

उत्तर

6

हां, आपका कोड सही है। हालत, लागू आबंटित स्मृति free() करने के लिए नीचे दिए गए

टिप्पणी देखते हैं, आप केवल malloc() और परिवार से लौटे सूचक पारित करने के लिए की जरूरत है।

के रूप में आप एक ही सूचक malloc()Add_them_up() समारोह से वापस द्वारा वापस हो रही है और presult में एक ही भंडारण, main() में, आप किसी भी मुद्दे के बिना

free (presult); 

कॉल कर सकते हैं। यह इच्छित नौकरी करेगा।


नोट: आप यहां दो पहलू गायब हैं, उदा।

  1. कृपया see why not to castC में malloc() और परिवार की वापसी मान।
  2. लौटे पॉइंटर का उपयोग करने से पहले हमेशा malloc() की सफलता की जांच करें।

जिसके अनुसार, केवल एक सुझाव है, हमेशा प्रपत्र

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

जो आवंटन बयान p के प्रकार के स्वतंत्र बनाता है, एक सबसे मजबूत कोड में जिसके परिणामस्वरूप उपयोग करने के लिए प्रयास करें।

+1

आपकी टिप्पणियों और स्पष्टीकरण के लिए धन्यवाद। मुझे दूसरा पहलू महसूस हुआ, मैं पहले सीख रहा हूं। – shinhwa

+0

कोड सिंटैक्स और कार्यक्षमता के रूप में सही है, लेकिन यह खराब प्रोग्राम डिज़ाइन है। – Lundin

3

इसे आम तौर पर खराब प्रोग्राम डिज़ाइन माना जाता है। मॉड्यूल जो malloc() को डिज़ाइन किया जाना चाहिए ताकि यह मुक्त() करने के लिए भी जिम्मेदार हो।

आपको कभी भी प्रोग्राम डिज़ाइन नहीं करना चाहिए ताकि कुछ बाहरी दिनचर्या आपके मॉड्यूल से गड़बड़ी को साफ कर दे। यह वास्तव में सभी सामान्य ज्ञान है।

तो इस मामले में, आपको मुफ्त में एक रैपर फ़ंक्शन जोड़ना चाहिए(), जो मुख्य() कॉल कर सकता है। मुख्य() को यह जानने की आवश्यकता नहीं है कि आपके दिनचर्या गतिशील आवंटन/डीलोकेशन कैसे करते हैं।

ध्यान दें कि प्रोग्राम जो इस प्रोग्राम डिज़ाइन का पालन नहीं करते हैं, उनमें स्मृति रिसाव से संबंधित बग होते हैं।

+0

अच्छी तरह से कहा, मुझे भी लगता है कि एक मुद्दा छोड़ दिया गया है। –

+1

@ सुमित डांगलिंग पॉइंटर्स केवल एक मुद्दा है यदि दिनचर्या को एक ही इनपुट के साथ फिर से बुलाया जाने की उम्मीद है। उस स्थिति में, यह उन दिनचर्या पर निर्भर करता है जो इसे संभालने के लिए मॉलोक/मुक्त करते हैं। – Lundin

+0

लेकिन अभी भी इसे नल बनाना एक अच्छी बात है, आपको नहीं लगता। –

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