2012-01-30 18 views
23

मैं कोड लिख रहा हूं जिसमें बहुत से2 आयामी सरणी हैं। मुझे "त्रुटि: क्षेत्र आवंटित नहीं किया जा सकता" और मुझे लगता है क्योंकि इसकी बहुत अधिक स्मृति आवंटित की गई है। मैं "malloc" और "free" फ़ंक्शंस का उपयोग करता हूं, लेकिन मुझे यकीन नहीं है कि मैं उनका उपयोग कर रहा हूं। शायद आप जानते हैं कि मैं सी में स्मृति प्रबंधन पर अच्छे उदाहरण कहां देख सकता हूं?मैं सी में मेमोरी कैसे मुक्त करूं?

तो .. मैं तो बस .. एक एल्गोरिथ्म काम प्राप्त करने की कोशिश है और अब के लिए इस कोड को समारोह के बाद सिर्फ समारोह है

//memory allocation for 1D arrays 
buffer = malloc(num_items*sizeof(double)); 

//memory allocation for 2D arrays 
double **cross_norm=(double**)malloc(150 * sizeof(double *)); 
for(i=0; i<150;i++) 
    { 
     cross_norm[i]=(double*)malloc(num_items*sizeof(double)); 
    } 

    //code 
Window(N, window_buffer); 
STFTforBMP(buffer,N,f, window_buffer); 
getMagnitude(buffer,f, N, magnitude); 
calculateEnergy(flux,magnitude, f); 
calculateExpectedEnergy(expected_flux, candidate_beat_period, downbeat_location, f); 
calculateCrossCorrelation(cross, flux, expected_values, f); 
findLargestCrossCorrelation(&cross_max, cross, f); 
normalizeCrossCorrelation(cross_norm, &cross_max, cross, f); 
    ............... 

मैं free समारोह का उपयोग कैसे करना चाहिए?

+6

शायद यह अधिक हमें दिखाने के लिए आप क्या करने की कोशिश की रचनात्मक हो सकता है? – cnicutar

+2

अपना कोड दिखाएं। – Pheonix

+0

आपको जो करना है उसके उदाहरण प्रदान करना चाहिए। अन्यथा आपका प्रश्न परे उत्तर देने के लिए बहुत सामान्य है: चश्मा पढ़ें। – akira

उत्तर

32

आपको आवंटित स्मृति को सटीक रिवर्स ऑर्डर में malloc() का उपयोग करके आवंटित किया गया है।

नोट आप स्मृति के बाद ही आप आवंटित संकेत के आपके उपयोग के साथ किया जाता है मुक्त होना चाहिए कि।-1 डी सरणियों के लिए

स्मृति आवंटन: 1 डी सरणियों के लिए

buffer = malloc(num_items*sizeof(double)); 

स्मृति आवंटन रद्द: 2 डी सरणियों के लिए

free(buffer); 

स्मृति आवंटन:

double **cross_norm=(double**)malloc(150 * sizeof(double *)); 
    for(i=0; i<150;i++) 
    { 
     cross_norm[i]=(double*)malloc(num_items*sizeof(double)); 
    } 

2 डी सरणियों के लिए स्मृति आवंटन रद्द:

for(i=0; i<150;i++) 
    { 
     free(cross_norm[i]); 
    } 

    free(cross_norm); 
24

आप वास्तव में सी में मैन्युअल रूप से "मुक्त" स्मृति नहीं कर सकते हैं, इस अर्थ में कि स्मृति को प्रक्रिया से ओएस पर वापस जारी किया जाता है ... जब आप malloc() पर कॉल करते हैं, अंतर्निहित libc-runtime ओएस से अनुरोध करेगा एक स्मृति क्षेत्र। लिनक्स पर, यह अपेक्षाकृत "भारी" कॉल जैसे mmap() किया जा सकता है। एक बार यह मेमोरी क्षेत्र आपके प्रोग्राम में मैप किए जाने के बाद, "आवंटित स्टोर" नामक एक लिंक-सूची सेटअप होता है जो इस आवंटित स्मृति क्षेत्र का प्रबंधन करता है। जब आप malloc() पर कॉल करते हैं, तो यह तुरंत दिखता है कि आकार के आकार पर स्मृति के एक मुक्त ब्लॉक के लिए फ्री-स्टोर। इसके बाद यह लिंक करने वाली सूची को समायोजित करने के लिए समायोजित करता है कि मूल रूप से आवंटित मेमोरी पूल से निकाली गई स्मृति का एक हिस्सा रहा है। जब आप free() पर कॉल करते हैं तो मेमोरी ब्लॉक को फ्री-स्टोर में एक लिंक-सूची नोड के रूप में वापस रखा जाता है जो इसे स्मृति का एक उपलब्ध खंड इंगित करता है।

यदि आप फ्री-स्टोर में स्थित चीज़ों की तुलना में अधिक मेमोरी का अनुरोध करते हैं, तो libc-runtime फिर से चल रहे प्रक्रियाओं के लिए स्मृति आवंटित करने की ओएस की क्षमता की सीमा तक ओएस से अधिक मेमोरी का अनुरोध करेगा। जब आप नि: शुल्क स्मृति हालांकि, इसे वापस ओएस को वापस नहीं है ... यह आम तौर पर मुक्त दुकान है जहां यह malloc() के लिए एक और कॉल द्वारा फिर से इस्तेमाल किया जा सकता में वापस पुनर्नवीनीकरण है। इस प्रकार, यदि आप स्मृति आकार अनुरोध अलग-अलग malloc() और free() के लिए कॉल का एक बहुत बनाने के लिए, यह, सिद्धांत रूप में, एक शर्त "स्मृति विखंडन" कहा जाता है, जहां आपके अनुरोध स्मृति ब्लॉक आवंटित करने के लिए मुक्त दुकान में पर्याप्त जगह नहीं है कारण बन सकता है , लेकिन आपके द्वारा अनुरोधित ब्लॉक के आकार के लिए संगत स्थान पर्याप्त नहीं है। इस प्रकार malloc() करने के लिए कॉल विफल रहता है, और आप को प्रभावी ढंग से "आउट-ऑफ-स्मृति" कर रहे हैं, भले ही उपलब्ध स्मृति के बहुत सारे मुक्त दुकान में बाइट्स की कुल राशि के रूप में हो सकता है।

+2

क्या यह सिर्फ मुझे है या यह है कि ओपी कुछ अलग पूछ रहा है और उत्तर (हालांकि अच्छी तरह से) कुछ और बताता है? –

+3

ओपी ने अपना प्रश्न अपडेट किया क्योंकि मैं अपना जवाब टाइप कर रहा था (मैं कुछ टिप्पणियों के जवाब में अनुमान लगा रहा हूं) ... मैंने सोचा कि मेरा जवाब अभी भी निर्देशक हो सकता है भले ही वह स्पष्ट रूप से अपने अपडेट किए गए प्रश्न का उत्तर न दे। उनके मूल प्रश्न में कोई कोड नहीं था और मूल रूप से वह 'मॉलोक' और 'फ्री' का उपयोग कर रहा था, लेकिन फिर भी "क्षेत्र आवंटित नहीं कर सकता" त्रुटि के साथ समाप्त हो रहा है। यह मुझे संभव स्मृति विखंडन की तरह लग रहा था, इसलिए मैंने सोचा कि यह एक अच्छा जवाब हो सकता है। – Jason

+0

आह मैं देखता हूँ। ठीक है। यह एक अच्छा स्पष्टीकरण है हालांकि बदले गए प्रश्न इसे जगह से बाहर महसूस करते हैं। वैसे भी आपके पास प्रयास के लिए मेरा +1 है। –

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