C会自动释放函数内的已分配内存吗?

时间:2015-01-09 18:33:48

标签: c malloc free

我创建了以下函数来获取Date Time字符串:

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'因为我需要传递其内容。我想知道那个记忆是否清除了。请帮忙。

5 个答案:

答案 0 :(得分:4)

它并不清楚。您必须在调用者函数中调用free,或者在上次访问内存的任何地方调用它。

示例:

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

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

答案 1 :(得分:2)

在C中,没有任何事情会自动发生。您malloc的每个对象以后必须使用free清除。由于您从函数返回DateTimeBuffer,因此数据的接收器应处理缓冲区,然后free。请务必对此功能进行彻底评论。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

char    *DateTimeBuffer

这是函数的本地指针。因此,当您从函数返回时,在您使用

之前,将不会释放分配的内存
free(DateTimeBuffer);

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

明确释放

答案 4 :(得分:1)

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