如您所知,<time.h>
标准标头定义了struct tm
和一个名为localtime
的函数。
localtime
是否进行堆分配
还是在堆栈中分配
它返回一个指针,但这可能只是指向堆栈值的指针,对吧?
C标准(C18)的相关部分有以下语言:
7.27.3时间转换函数
除了
strftime
函数外,这些函数都返回一个指针,指向两种类型的静态对象之一:分解的时间结构或char
的数组。执行任何返回指向这些对象类型之一的指针的函数,都可能覆盖从以前对其中任何对象的调用返回的值所指向的相同类型的任何对象中的信息,并且函数不需要避免彼此之间的数据竞争。实现应表现为没有其他库函数调用这些函数。
localtime
返回一个指向静态struct tm
对象的指针,即:一个可能是也可能不是线程本地的全局对象。此对象的内容可以由对该库函数或其他库函数的后续调用覆盖。在调用函数的线程退出后,不应访问它。
对象不是从堆中分配的,您不能使用此指针调用free
。
无法为对象分配自动存储,因为在函数localtime
返回后访问它将具有未定义的行为。
您应该使用localtime_r
,而不是localtime
,这是一个POSIX函数,将包含在下一版本的C标准(C23):中
#include <time.h>
struct tm *localtime_r(const time_t *timer, struct tm *buf);
localtime_r
获取一个指向目标对象的指针,您可以根据自己的使用情况定义或分配目标对象。
MSVC可能不支持此功能,但您可以在其目标平台上将其定义为一个简单的宏:
#ifdef _MSC_VER
#define localtime_r(a,b) localtime_s(a,b)
#endif
localtime
返回一个指向全局变量的指针,它通常在所有线程之间共享:
返回值:成功时指向静态内部
std::tm
对象的指针,否则为空指针。该结构可以在std::gmtime
、std::localtime
和std::ctime
之间共享,并且可以在每次调用时被重写。
此函数可能不是线程安全的
现代应用程序应该使用localtime_r
而不是localtime
。
示例:localtime
的glibc实现。