我正试图在函数中使用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的堆大小有限。但是我想返回它,所以我不能在函数中释放它,对吧?。我可以在函数外(调用函数的位置)释放分配的内存吗。对此有什么最佳实践吗?提前谢谢!
由于malloc()分配的内存在堆上,而不是在堆栈上,所以无论您在哪个函数中,都可以访问它。如果您想传递malloc的内存,除了从调用方释放它之外,别无选择。(在参考计数术语中,这就是所谓的所有权转移。)
1)是的,您可以在函数之外释放()malloc’ed内存
2) 不,你不能在函数内释放它,也不能让数据在函数外传递,所以你必须在这里做1)
3) 如果您担心内存不足,则需要从内存分配中检查是否存在故障always,而您在这里没有做到这一点,这可能会导致segfault
当然,如果返回,您可以释放在该函数之外的函数中分配的内存。
但是,另一种选择是修改您的函数,如下所示,调用者只分配&释放内存。这将与分配内存并负责释放内存的函数的概念一致。
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);
是的,您可以释放在函数外部调用的函数中分配的内存;这正是你在这种情况下需要做的。
替代方案包括将缓冲区及其长度传递到函数中,并像fgets
那样将实际长度返回给调用者。这可能不是最好的选择,因为调用者需要在循环中调用您的函数。