【问题标题】:Free allocated memory before return a function在返回函数之前释放分配的内存
【发布时间】:2012-07-29 22:39:06
【问题描述】:

我正在尝试在函数中使用 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 的全部内容。如果您不能这样做,就没有理由创建 malloc

标签: c pointers malloc free


【解决方案1】:

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

【讨论】:

  • 很好的解释。
【解决方案2】:

1) 是的,您可以在函数外释放()分配的内存

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

3) 如果您担心内存不足,则需要从内存分配中检查是否失败总是,而您在此处未执行此操作,则可能会导致段错误 p>

【讨论】:

  • "...一个段错误" 或者更糟糕的是,在嵌入式系统中。
  • 是的,当您在函数外释放 malloc 的内存时,我确实担心这个问题。你怎么能解决它?
  • @KiL “修复”是处理您的内存分配例程无法分配您想要的内存并正常失败的情况,而不是执行任何控制线程被 NULL 限制指针。
【解决方案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 所做的那样。这可能不是最好的选择,因为调用者需要循环调用你的函数。

    【讨论】:

    • 反对者,请解释您认为这个答案有什么问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多