返回函数前自由分配内存

时间:2012-08-01 04:00:12

标签: c pointers malloc free

我试图在函数中使用 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堆大小有限。但是我想退回它,所以我不能在功能中释放它,对吧?我可以在函数外部释放已分配的内存(我称之为函数)。这有什么最佳做法吗?提前谢谢!

4 个答案:

答案 0 :(得分:10)

1)是的,你可以释放()函数外的malloc内存

2)不,你不能在函数内释放它并将数据传递到函数外部,所以你必须在这里做1)

3)如果你担心内存不足,你需要检查内存分配始终的失败,你在这里做不到,这可能会导致段错误

答案 1 :(得分:9)

由于malloc()分配的内存在堆上,而不在堆栈上,无论你使用哪个函数,都可以访问它。如果你想传递malloc()的内存,你没有别的选项,而不是从调用者那里释放它。 (在参考计算术语中,这就是所谓的所有权转移。)

答案 2 :(得分:8)

当然,如果你返回它,你可以释放在该函数之外的函数中分配的内存。

但是,另一种方法是修改你的功能,如下所示,调用者只分配&amp;释放记忆。这将与函数的概念一致,分配内存负责释放内存。

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

答案 3 :(得分:5)

是的,您可以释放在函数外部调用的函数中分配的内存;这正是你在这种情况下需要做的事情。

替代方法包括将缓冲区及其长度传递给函数,并将实际长度返回给调用者,方式fgets。这可能不是最佳选择,因为调用者需要在循环中调用您的函数。