2012-08-01 13 views
10

मैं एक समारोह में एक सरणी malloc का उपयोग कर वापस जाने के लिए कोशिश कर रहा हूँ वापसी:नि: शुल्क आबंटित स्मृति से पहले एक समारोह

char* queueBulkDequeue(queueADT queue, unsigned int size) 
{ 
    unsigned int i; 
    char* pElements=(char*)malloc(size * sizeof(char)); 
    for (i=0; i<size; i++) 
    { 
     *(pElements+i) = queueDequeue(queue); 
    } 
    return pElements; 
} 

समस्या यह है कि मैं मुक्त करने की जरूरत है यह क्योंकि मेरे MCU है ढेर आकार सीमित है है । लेकिन मैं इसे वापस करना चाहता हूं इसलिए मैं इसे फ़ंक्शन में मुक्त नहीं कर सकता, है ना? क्या मैं फ़ंक्शन के बाहर आवंटित स्मृति को खाली कर सकता हूं (जहां मैं फ़ंक्शन को कॉल करता हूं)। क्या इसके लिए कोई सर्वोत्तम प्रथा है? आपका अग्रिम में ही बहुत धन्यवाद!

+2

आपको इसे फ़ंक्शन के बाहर मुक्त करना होगा। इस बात की कोई आवश्यकता नहीं है कि किसी भी तरह से malloc'd स्मृति को फ़ंक्शन के अंदर मुक्त किया जाना चाहिए। बेशक – futureelite7

+0

। यह 'malloc' का पूरा बिंदु है। यदि आप ऐसा नहीं कर पा रहे थे, तो 'malloc' को कभी भी बनाए जाने का कोई कारण नहीं होता। –

उत्तर

9

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

4

हां, आप फ़ंक्शन के बाहर कॉल किए गए फ़ंक्शन में आवंटित स्मृति को मुक्त कर सकते हैं; यह वही है जो आपको इस मामले में करने की ज़रूरत है।

विकल्प में एक बफर और इसकी लंबाई को फ़ंक्शन में पास करना, और कॉलर को वास्तविक लंबाई वापस करना शामिल है, जिस तरह fgets करता है। यह सबसे अच्छा विकल्प नहीं हो सकता है, क्योंकि कॉलर्स को आपके फ़ंक्शन को लूप में कॉल करने की आवश्यकता होगी।

+0

डाउनवॉटर, कृपया इस जवाब के साथ गलत सोचें कि आप क्या सोचते हैं। – dasblinkenlight

10

1) हाँ, आप (मुक्त कर सकते हैं) समारोह

2) नहीं, आप यह समारोह के अंदर मुक्त नहीं कर सकते हैं और डेटा समारोह के बाहर पारित कर दिया है बाहर malloc'ed स्मृति है, तो आप 1 करना चाहिए) यहाँ

3) यदि आप दुर्लभ स्मृति के बारे में चिंतित हैं, तो आप स्मृति आवंटन हमेशा, जिसे आप यहां करने में विफल रहते हैं, जो फिर एक segfault

+1

"... एक segfault" या बदतर, एक एम्बेडेड सिस्टम में। –

+0

हां, जब आप फ़ंक्शन के बाहर एक malloc'd स्मृति मुक्त करते हैं, तो मुझे इस समस्या के बारे में चिंता है। आप इसे कैसे ठीक कर सकते हैं? – KiL

+0

@KiL "फिक्स" उस मामले को संभालने के लिए है जहां आपकी मेमोरी आवंटन दिनचर्या आपकी इच्छित स्मृति आवंटित करने में असमर्थ हैं, और नियंत्रण के जो भी थ्रेड को एक पूर्ण सूचक द्वारा b0rkened प्राप्त करने के बजाय निष्पादन में विफल रहता है। – tbert

7

करने के लिए नेतृत्व की संभावना है से विफलता के लिए जांच करने की आवश्यकता आप उस समारोह के बाहर किसी फ़ंक्शन में आवंटित स्मृति को मुक्त कर सकते हैं बशर्ते आप मुझे वापस कर दें टी।

लेकिन, एक विकल्प नीचे आपके कार्य को संशोधित करना होगा, जहां कॉलर केवल & आवंटित करता है स्मृति को मुक्त करता है। यह फ़ंक्शन की अवधारणा के साथ इनलाइन होगा जो मेमोरी को आवंटित करने के लिए स्मृति को आवंटित करता है।

void queueBulkDequeue(queueADT queue, char *pElements, unsigned int size) 
{  
    unsigned int i;  
    for (i=0; i<size; i++)  
    {   
     *(pElements+i) = queueDequeue(queue);  
    }  
    return; 
} 

// फोन करने वाले

char *pElements = malloc(size * sizeof(char)); 
queueBulkDequeue(queue, pElements, size); 
//Use pElements 
free(pElements); 
संबंधित मुद्दे