【问题标题】:does C automatically free allocated memory inside a function?C 会自动释放函数内分配的内存吗?
【发布时间】:2015-01-09 18:33:48
【问题描述】:

我创建了以下函数来获取日期时间字符串:

char *GetDateTime (int Format)
{
    if (Format > 2) Format = 0;

    double  DateTimeNow;
    int     BufferLen;
    char    *DateTimeFormat [3] =   {   "%X %x" ,   //Time Date
                                        "%x"    ,   //Date
                                        "%X"    };  //Time
    char    *DateTimeBuffer = NULL;

                        GetCurrentDateTime      (&DateTimeNow);
    BufferLen       =   FormatDateTimeString    (DateTimeNow, DateTimeFormat [Format], NULL, 0);
    DateTimeBuffer  =   malloc                  (BufferLen + 1);
    FormatDateTimeString    (DateTimeNow, DateTimeFormat [Format], DateTimeBuffer, BufferLen + 1 );

    return DateTimeBuffer;
}

我没有释放“DateTimeBuffer”,因为我需要传递它的内容。我想知道那段记忆是否会自行清除。请帮忙。

【问题讨论】:

标签: c malloc free


【解决方案1】:

它不会自行清除。您必须在调用者函数中调用free,或者在最后一次访问内存的地方调用。

例子:

char *dateTimeBuffer = GetDateTime(1);
 .
 . 
 /*  do stuff with dateTimeBuffer */
 .
 .
 /* you don't need dateTimeBuffer anymore */
free(dateTimeBuffer);

每当您使用malloc 时,您必须手动使用free,但是当您退出它所在的范围时,堆栈上分配的内存会自动清除,例如在您的GetDateTime() 函数中DateTimeFormat 将被自动清除当函数返回时。

【讨论】:

  • 但是我怎样才能在'free'之后传回结果呢?
  • @CaTx free 之后你想将结果传递到哪里我不明白你的问题,当你不再需要数据时你打电话给free
  • 'return' 传回结果,并离开函数。因此,如果 'return' 在 'free' 之前,则永远不会执行 'free'。如果 'free' 在 'return' 之前,则结果丢失。如何处理这个问题?
  • 不,你明白了...你返回一个指向malloc返回的内存的指针,然后你在函数之外有指针,当你完成它,然后你调用@ 987654330@。顺便说一句,您应该始终检查 malloc 确实返回了一个有效的指针。我的例子不是很清楚吗?
  • iharob,请原谅我的无知。直到现在我才意识到语法的含义。非常感谢您。我是 C 新手。
【解决方案2】:

在 C 中,不会自动发生任何事情。您malloc 的每个对象都必须稍后使用free 清除。由于您要从函数中返回 DateTimeBuffer,因此数据的 receiver 应该处理缓冲区,然后是 free 它。请务必对函数进行彻底的注释。

【讨论】:

  • 有些事情会自动发生,有些则不会。为非static 局部变量分配的内存在退出函数(或从封闭块)时自动释放,这就是为什么说这些变量具有自动存储持续时间。在您明确调用free() 或等效项之前,不会释放使用malloc() 分配的内存。
【解决方案3】:
char    *DateTimeBuffer

这是函数的本地指针。因此,当您从函数返回时,分配的内存将不会被释放,直到您使用

free(DateTimeBuffer);

但是由于内存是在堆上分配的,您可以返回在函数之外仍然有效的位置地址。使用后分配的内存应该使用free()显式释放

【讨论】:

    【解决方案4】:

    不,不清楚。malloc 函数将从堆中请求一块内存。当不再需要时,您必须将返回形式 malloc 的指针传递给 free 函数,这会释放内存,以便将其用于其他目的。

    【讨论】:

      【解决方案5】:

      不,分配有malloc 的每个区域都应该由free 显式释放;如果你不这样做,你可能会发生内存泄漏。在大多数操作系统上,当一个进程终止时,它的所有地址空间都会被释放(所以如果你不free 内存,它会随着它的地址空间消失)

      【讨论】:

        猜你喜欢
        • 2012-11-06
        • 2012-09-24
        • 2013-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-11
        • 1970-01-01
        • 2013-02-28
        相关资源
        最近更新 更多