2012-08-01 54 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的內存必須在函數內部釋放。 – futureelite7 2012-08-01 04:03:21

+0

當然。這是'malloc'的全部要點。如果你不能這樣做,就沒有理由爲'malloc'創建任何東西。 – 2012-08-01 05:24:45

回答

9

如malloc的(分配的內存)是在堆和未在堆棧上,則可以不管其功能你在訪問它。如果你想傳遞malloc()'ed內存,你幾乎沒有別的選擇,只能將它從調用者中解放出來。 (在引用計數術語中,這就是所謂的所有權轉移。)

4

是的,你可以釋放分配給你在函數外部調用的函數中分配的內存;這正是你在這種情況下需要做的。

替代方法包括將緩衝區及其長度傳遞給函數,並將實際長度返回給調用者,方法如下:fgets。這可能不是最好的選擇,因爲調用者需要在循環中調用你的函數。

+0

Downvoter,請解釋你認爲這個答案是錯誤的。 – dasblinkenlight 2012-08-01 14:00:14

10

1)是的,你可以免費()函數

2)不,你不能釋放它的函數內部和具有的功能外傳遞的數據之外的malloc分配的內存,所以你必須做1 )這裏

3)如果你擔心稀少的內存,您需要從內存分配總是,你不能在這裏做,這則可能導致段錯誤

+1

「... segfault」或者更糟,在嵌入式系統中。 – 2012-08-01 04:06:52

+0

是的,當你在函數外部釋放一個malloc'd內存時,我會關心這個問題。你怎麼解決它? – KiL 2012-08-01 04:19:55

+0

@KiL「修復」是處理你的內存分配例程無法分配你想要的內存的情況,並且優雅地失敗,而不是任何正在執行的控制線程正在被NULL指針取代。 – tbert 2012-08-01 07:19:26

7

檢查是否存在故障當然,如果你返回i,你可以釋放在該函數之外的函數中分配的內存噸。

但是,另一種方法是像下面那樣修改你的函數,調用者只分配內存。這將與分配內存負責釋放內存的功能的概念一致。

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);