假设我有以下C代码:
void myfunction() {
time_t t = 0;
struct tm *ct;
time(&t);
ct = localtime(&t);
}
如您所见,localtime
函数返回一个指向struct tm
变量的新指针。据我所知,对于函数返回的变量在调用者上下文中有效,它需要满足以下至少一个:
在我的情况下,第一点不适用,所以认为第二点已经完成是正常的。
我是对的吗?
如果是,这是否意味着我需要在使用ct
变量后免费调用它?
如果没有,你能详细一点吗?
谢谢!
编辑:
从响应中,我了解到需求中应该有另一个要点,即变量可以在返回的上下文中使用。那应该是静态变量。还有其他可能性吗?
答案 0 :(得分:2)
几个较旧的C函数返回指向静态缓冲区的指针。 localtime
就是其中之一。你不需要(事实上不应该;如果你这样做,你可能会破坏你的程序)从localtime
释放返回的指针。
问题是进程空间中只有一个localtime
缓冲区,下一次调用localtime
(即使在另一个线程中)将覆盖先前返回的结果。这就是为什么几乎所有行为方式的函数(strtok
都是另一个例子)现在都有新的_r
版本,它们将结果放在用户传入的缓冲区中,因此是线程安全的。
答案 1 :(得分:1)
不,你不需要释放它:
返回的值指向内部对象,其有效性或 任何后续的gmtime或localtime调用都可能会改变该值。
换句话说,如果要保存此函数的返回值,则应手动将其保存在其他位置。
答案 2 :(得分:1)
从Linux上的man localtime
逐字逐句:
四个函数asctime(),ctime(),gmtime()和localtime()返回一个指向静态数据的指针,因此不是线程安全的。
所以不,没有必要释放localtime()
返回的值,甚至更多你甚至不会试图释放它。
OT:为保持线程安全,手册页指出:
线程安全版本asctime_r(),ctime_r(),gmtime_r()和localtime_r()由 SUSv2,自libc 5.2.5起可用。