我正在使用C中的time.h
文件来帮助我们处理时间/日期功能。
我遇到了:
struct tm * _Cdecl localtime(const time_t *__timer);
...似乎返回一个指向tm结构的指针。我发现按地址返回主要用于返回新的内存分配。
如果是这样,上述返回实际上是如何工作的(struct tm
的返回地址)。返回的对象是否定义在某处?
由于
答案 0 :(得分:44)
localtime
(以及其他一些函数)返回的指针实际上是指向静态分配内存的指针。 所以你不需要释放。此外,你不应该释放它。
http://www.cplusplus.com/reference/clibrary/ctime/localtime/
此结构由函数静态分配和共享 gmtime和localtime。每次这些功能中的任何一个都是 被称为该结构的内容被覆盖。
编辑:在评论中附加一些内容。
这种共享数据结构的直接结果是localtime
和类似的函数不是线程安全的。线程安全的解决方案因不同的平台而异。 localtime_r
for POSIX和localtime_s
for MSVC。
答案 1 :(得分:11)
它返回一个指向静态分配内存的指针(可能是static
中定义的localtime
变量或C运行时库中某处定义的全局变量。你不能释放这样的记忆。
显然这个函数不是可重入的(但如果使用TLS则可以是线程安全的。)
使用此指针时必须小心:在完成使用该指针之前,永远不要进行任何可以调用localtime
/ gmtime
/ ...的函数调用,否则引用的内存内容您的指针可能会更改(响应对localtime
的新调用),您将读取相对于另一个time_t
的值。
一般来说,日期/时间库的设计已经过时了,这种优化在设计C语言时是值得的,现在它只会产生问题。
要解决这些问题,这些功能至少有两个不同的改进版本:localtime_r
(SUSv2,r
停留为“可重入”)和localtime_s
(Microsoft,{{1保持“安全”)。可移植性的可悲事实是它们几乎完全相同(它们需要将目标s
作为参数传递),但参数的名称和顺序不同。
答案 2 :(得分:5)
man page说:
返回值指向静态分配的结构,可能会被后续调用任何日期和时间函数覆盖。
此外:
localtime_r()函数执行相同操作,但将数据存储在用户提供的结构中。它不需要设置tzname,timezone和daylight。
答案 3 :(得分:3)
实际上localtime
通常会返回静态对象的地址。我怀疑它看起来像这样:
struct tm *
localtime(const time_t *timer)
{
static struct tm tm;
/* Magic. */
return &tm;
}
答案 4 :(得分:3)
它们返回指向库本地静态结构的指针。从手册页:
NOTES The four functions asctime(), ctime(), gmtime() and localtime() return a pointer to static data and hence are not thread-safe. Thread-safe versions asctime_r(), ctime_r(), gmtime_r() and localtime_r() are spec‐ ified by SUSv2, and available since libc 5.2.5. POSIX.1-2001 says: "The asctime(), ctime(), gmtime(), and localtime() functions shall return values in one of two static objects: a broken- down time structure and an array of type char. Execution of any of the functions may overwrite the information returned in either of these objects by any of the other functions." This can occur in the glibc implementation.
答案 5 :(得分:0)
localtime
函数返回的指向对象具有静态存储持续时间。