c-在返回函数之前释放已分配的内存



我正试图在函数中使用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那样将实际长度返回给调用者。这可能不是最好的选择,因为调用者需要在循环中调用您的函数。

相关内容

  • 没有找到相关文章

最新更新