2015-05-01 12 views
13

क्या निम्न कोड x के लिए आवंटित स्मृति को मुक्त करता है?नि: शुल्क एक नियुक्त सूचक

int main() 
{ 
    char *x = (char*)calloc(100, sizeof(char)); 
    char *y = x; 
    free(y); 
} 
+4

हाँ, यह x –

+9

के लिए आवंटित स्मृति को मुक्त करता है ['malloc() '(या' calloc()') नहीं डालें!] (Http://stackoverflow.com/a/605858/3488231) – ace

+0

@ एंड्रे चेर्नुखा, इसका उत्तर है [यह निर्भर करता है] (http://stackoverflow.com/a/30000348/3049655)। (आपने * ओपी के संपादन से पहले * टिप्पणी पोस्ट की है) –

उत्तर

18

हाँ

आप स्थान जहां x अंक के लिए y बिंदु बनाने जब आप

char *y = x; 

है। एक स्मृति स्थान calloc द्वारा वापस करने के लिए y अंक, के बाद से

free(y); 

पूरी तरह से वैध है।@hacckscommented के रूप में, यदि आप y को अन्य मेमोरी स्थान पर इंगित करते हैं, तो यह काम नहीं करेगा, बशर्ते कि यह स्मृति स्थान malloc/calloc/realloc द्वारा वापस नहीं किया गया था।


सी में, आप should not cast the result of malloc/calloc/realloc। इसके अलावा, यह देखने के लिए कि यह सफल था या नहीं, calloc के वापसी मूल्य की जांच करना अच्छा है। calloc विफलता पर NULL वापस करेगा।

+0

यह अच्छा होगा अगर आप जोड़ते हैं कि यह काम नहीं करता है यदि 'y' को किसी अन्य मेमोरी स्थान पर फिर से सौंप दिया गया है। – haccks

+0

तकनीकी रूप से, 'मुफ़्त (एनयूएलएल) 'कानूनी और नो-ऑप है, इसलिए इस बेहद सरल उदाहरण में, ओपी का कोड पूरी तरह से वापसी मूल्य की जांच नहीं कर रहा है। – Kevin

+0

@ haccks, हो गया :) –

5

प्रश्न के मूल संस्करण था

int *y = x; 
free(y); 

अर्थात char सूचक को int पॉइंटर को असाइन करना और फिर पॉइंटर पर free() का आह्वान करें। free() का हस्ताक्षर void free(void *ptr); है इसलिए char * बनाम int * के बावजूद, स्मृति जारी की जाएगी।

सवाल का संपादित (और मौजूदा) संस्करण

char *y = x; 
free(y); 

यहाँ, दोनों y और x अंक ही याद करने के लिए है। इसे पॉइंटर एलियासिंग के रूप में जाना जाता है। free() पर कॉल करने पर, उस स्मृति को निश्चित रूप से रिलीज़ किया जाएगा।

एक समस्या यह है कि free(y) के बाद, सूचक xझूलते होगा, अर्थात स्मृति यह की ओर इशारा करते है अब वैध नहीं है।

नोट, यह न तो आवश्यक है और न ही calloc से वापसी मूल्य डालने की अनुशंसा की जाती है।

+0

'char * x = ...; int * y = x; 'एक असंगत सूचक प्रकार को असाइन करने के कारण, अपरिभाषित व्यवहार को उत्तेजित करता है। बाद में कुछ भी हो सकता है। तो सही जवाब "* हो सकता है। *"। – alk

+2

"एक असंगत सूचक प्रकार के लिए" असाइन करना - स्वयं में नहीं - अपरिभाषित व्यवहार का कारण बनता है। अपरिभाषित व्यवहार के परिणाम अगर असंगत प्रकार के सूचक को संदर्भित किया गया है। प्रश्न के मूल संस्करण में कोड ने ऐसा नहीं किया, इसलिए अपरिभाषित व्यवहार प्रदर्शित नहीं किया। – Peter

0

calloc() की कॉल द्वारा लौटाई गई स्मृति free() की कॉल द्वारा जारी की गई है।

आपके कोड में x और y दोनों को प्रभावित करता है।

1

हां, यह करता है।

विधि void free(void *ptr) है, तो जब आप char* y = x बनाते हैं, तो आपके पास y इंगित करने वाली एक ही स्पेस मेमोरी के लिए एक सूचक है।

जो आपको बाद में free (y) के साथ उस स्थान को मुक्त करने देता है।

हालांकि, आप x = NULL डाल देंगे क्योंकि अब x के पास कोई मूल्य नहीं होने के बावजूद अपनी जगह नहीं है।

मुफ्त पढ़ने के बारे में अधिक जानकारी के लिए here

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