Свободная выделенная память перед возвратом функции
Я пытаюсь вернуть массив, используя 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 ограничен. Но я хочу вернуть его, чтобы я не мог освободить его в функции, верно?. Могу ли я освободить выделенную память за пределами функции (где я вызываю функцию). Есть ли какие-либо рекомендации для этого? Заранее благодарю вас!
Ответы
Ответ 1
Поскольку память, выделенная функцией malloc(), находится в куче, а не в стеке, вы можете получить к ней доступ независимо от того, в какой функции вы находитесь. Если вы хотите передать память, выделенную malloc(), у вас нет другого выбора, кроме освобождения это от звонящего. (в терминах подсчета ссылок это то, что называется передачей права собственности.)
Ответ 2
1) Да, вы можете освободить() память malloc'а вне функции
2) Нет, вы не можете освободить его внутри функции и передать данные вне функции, поэтому вы должны сделать 1) здесь
3) Если вы беспокоитесь о нехватке памяти, вам всегда нужно проверять наличие сбоев в распределении памяти, что вы не можете сделать здесь, что, вероятно, приведет к segfault
Ответ 3
Конечно, вы можете освободить память, выделенную функцией вне этой функции, если вы ее вернете.
Но альтернативой было бы изменить вашу функцию, как показано ниже, где вызывающий абонент выделяет и освобождает память. Это будет встроено в концепцию функции, которая выделяет память, берет на себя ответственность за освобождение памяти.
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);
Ответ 4
Да, вы можете освободить память, выделенную в функции, которую вы вызываете вне функции; это именно то, что вам нужно сделать в этом случае.
Альтернативы включают передачу буфера и его длины в функцию и возврат фактической длины вызывающей стороне, как это делает fgets
. Возможно, это не лучшая альтернатива, потому что вызывающие абоненты должны будут вызывать вашу функцию в цикле.
Ответ 5
ВОПРОС - если вы делаете функцию, которая возвращает указатель на массив из 20 комплексных чисел,
после помещения значений в массив при выходе из функции,
если вы наберете return (arrayptr); ? } или вы должны ввести return (arrayptr); free (arrayptr)}