是否需要释放使用函数返回变量的内存(C)?

时间:2013-03-20 07:09:09

标签: c memory-management return-value

假设我有以下C代码:

void myfunction() {
    time_t     t = 0;
    struct tm  *ct;

    time(&t);
    ct = localtime(&t);
}

如您所见,localtime函数返回一个指向struct tm变量的新指针。据我所知,对于函数返回的变量在调用者上下文中有效,它需要满足以下至少一个:

  1. 必须在调用者的上下文或与调用者相关的更高上下文中声明返回的变量。
  2. 返回的变量必须在堆上具有已分配的内存。
  3. 在我的情况下,第一点不适用,所以认为第二点已经完成是正常的。

    我是对的吗?

    如果是,这是否意味着我需要在使用ct变量后免费调用它?

    如果没有,你能详细一点吗?

    谢谢!


    编辑:

    从响应中,我了解到需求中应该有另一个要点,即变量可以在返回的上下文中使用。那应该是静态变量。还有其他可能性吗?

3 个答案:

答案 0 :(得分:2)

几个较旧的C函数返回指向静态缓冲区的指针。 localtime就是其中之一。你不需要(事实上不应该;如果你这样做,你可能会破坏你的程序)从localtime释放返回的指针。

问题是进程空间中只有一个localtime缓冲区,下一次调用localtime(即使在另一个线程中)将覆盖先前返回的结果。这就是为什么几乎所有行为方式的函数(strtok都是另一个例子)现在都有新的_r版本,它们将结果放在用户传入的缓冲区中,因此是线程安全的。

答案 1 :(得分:1)

不,你不需要释放它:

  

返回的值指向内部对象,其有效性或   任何后续的gmtime或localtime调用都可能会改变该值。

Source

换句话说,如果要保存此函数的返回值,则应手动将其保存在其他位置。

答案 2 :(得分:1)

从Linux上的man localtime逐字逐句:

  

四个函数asctime(),ctime(),gmtime()和localtime()返回一个指向静态数据的指针,因此不是线程安全的。

所以不,没有必要释放localtime()返回的值,甚至更多你甚至不会试图释放它。

OT:为保持线程安全,手册页指出:

  

线程安全版本asctime_r(),ctime_r(),gmtime_r()和localtime_r()由          SUSv2,自libc 5.2.5起可用。