2013-09-28 9 views
7

मैं निम्नलिखित है struct:क्या मुझे स्थानीय चर मुक्त करने की आवश्यकता है?

typedef struct cell Cell; 
struct cell { 
    int value; 
    int *nextcell; 
}; 

और मैं एक लिंक्ड सूची मुक्त करने के लिए निम्न कार्य हो:

void freelist(Cell *beginning) 
{ 
    Cell *thisCell = beginning; 
    Cell *NextCell = beginning->nextcell; 

    while (thisCell != NULL) 
    { 
     NextCell = thisCell->nextcell; 
     free(thisCell); 
     thisCell = NextCell; 
    } 

    /* Here comes my question. Do I need to free the following variables? */ 
    free(beginnig); 
    free(thisCell); 
    free(NextCell); 
} 
+6

आप वैरिएबल मुक्त नहीं करते हैं, आप मुफ्त मेमोरी। अंगूठे का नियम: एक मुफ्त प्रति मॉलोक (या realloc)। –

उत्तर

7

नहीं है, मुक्त गतिशील आबंटित स्मृति के लिए है, एक सूचक सिर्फ एक है वेरिएबल जो वहां इंगित करता है। आपका लूप सूची में ली गई सभी यादों को मुक्त करता है - उस बिंदु पर मुफ्त में कुछ भी नहीं है और उसी स्मृति को फिर से शुरू करने की कोशिश कर रहा है (शुरुआत) के परिणामस्वरूप एक त्रुटि होगी। लूप के बाद यह सेल नल है वहां वहां कुछ भी मुक्त नहीं है।

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

+0

Thks आदमी, जो मेरे सवाल का जवाब है! =) –

+0

यह सच है कि यह सही है या नहीं, यह जांचने का सबसे अच्छा तरीका है कि स्टैक पर संग्रहीत चर पर मुफ्त() लागू करें और देखें कि क्या होता है। :) – rbaleksandar

2

आप मुफ्त मेमोरी जिसे आप पॉइंटर संग्रहीत करते हैं, किसी स्थानीय चर में, वैश्विक/स्थैतिक चर में, या नि: शुल्क स्टोर पर आवंटित पॉइंटर में आवंटित करते हैं।

आपका फ़ंक्शन कई पॉइंटर्स को कई बार मुक्त करता है: आपको अपने फ़ंक्शन के निचले भाग में नि: शुल्क तीन कॉलों की आवश्यकता नहीं है (हालांकि दूसरी कॉल हानिरहित है, क्योंकि यह मुक्त करने के लिए नल को पास करती है, जो हमेशा ठीक होती है)।

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