localtime函数不安全怎么办,localtime线程不安全

http://www.itjxue.com  2023-01-18 08:18  来源:未知  点击次数: 

为什么localtime线程不安全

从localtime函数的原型定义分析

struct tm *localtime(const time_t *timep);

localtime函数返回了一个struct tm指针,函数的说明中并未要求调用者将该指针free掉,证明tm对象并非是malloc或new出来的。那么tm一定是个全局变量或者是localtime函数中的局部静态变量。

这样的变量在多线程访问时会出问题,第一个线程在localtime返回之前首先改变了这个变量的值,第二个线程又进来改变这个变量,以此类推。这样第一个线程在真正返回时该值已经被多次改变,这是典型的函数重入问题。

因此localtime函数线程不安全。

vs2013写c++程序,其中localtime_s函数不接受一个参数怎么解决?!

Visual C++ 6.0开发环境中显示当地日期与时间主要通过localtime()函数来实现,该函数的原型在time.h头文件中,其语法格式如下:

struct tm *localtime(xonst time_t *timer)

该函数的作用是把timer所指的时间(如函数time返回的时间)转换为当地标准时间,并以tm结构形式返回。其中,参数timer为主要获取当前时间的传递参数,格式为time_t指针类型。

而在Visual Studio 2010及其以后的版本,新增了安全函数,改成localtime_s(),语法格式也发生了变化:

errno_t?localtime_s(

???struct?tm*?_tm,

???const?time_t?*time?

);

其中:

_tm

指向要填充的时间结构的指针。

time

指针,指向存储的时间。

如果成功,返回值则为零。?如果失败,返回值将是错误代码。?错误代码是在 Errno.h 中定义的。

结构类型的字段 tm 存储下面的值,其中每个为?int。

tm_sec

分钟后的几秒 (0-59)。

tm_min

小时后的分钟 (0-59)。

tm_hour

午夜后经过的小时 (0-23)。

tm_mday

月 (1-31) 天。

tm_mon

月 (0 – 11;年 1 月 = 0)。

tm_year

年份 (当前年份减去 1900年)。

tm_wday

星期几 (0 – 6;星期日 = 0)。

tm_yday

每年的一天 (0-365;1 月 1 日 = 0)。

tm_isdst

如果夏令时有效,则为,正值夏时制不起作用; 如果为 0如果夏时制的状态是未知的负值。 如果 TZ 设置环境变量,C 运行库会假定规则适用于美国境内用于实现夏令时 (DST) 计算。

下面以一个Visual Studio 2015实例来输出当地日期与时间:

#include?iostream

#include?ctime

using?namespace?std;

int?main(void)

{

????struct?tm?t;????//tm结构指针

????time_t?now;?????//声明time_t类型变量

????time(now);?????//获取系统日期和时间

????localtime_s(t,?now);???//获取当地日期和时间

????????

????//格式化输出本地时间

????printf("年:%d\n",?t.tm_year?+?1900);

????printf("月:%d\n",?t.tm_mon?+?1);

????printf("日:%d\n",?t.tm_mday);

????printf("周:%d\n",?t.tm_wday);

????printf("一年中的第%d天\n",?t.tm_yday);

????printf("时:%d\n",?t.tm_hour);

????printf("分:%d\n",?t.tm_min);

????printf("秒:%d\n",?t.tm_sec);

????printf("夏令时:%d\n",?t.tm_isdst);

????system("pause");

????return?0;

}

localtime 线程安全吗

localtime localtime返回一个指向静态变量的指针,这样是线程不安全的

linux 下 C/C++ 使用标准库函数 ( 可能造成的内存泄露问题?)

c++

用的是

delete吧..

我觉得系统会自动调用释放内存的函数的

应该不用自己加的.

无论返回什麽结构

在内存调用完的每个函数的入口地址都是指向函数的指针阿.

就像你的例子

tm*

指向

localtime()入口地址

如果系统没有自动释放的话

后果将不堪设想喔..

想想全局变量带来的危机

其实道理差不多

所以不用free了吧..

我猜的.

哈哈.

localtime(&curTime)为啥显示错误啊

你好,代码本身没有什么问题,你应该用的是VS2010以上的版本吧,localtime这个函数不是安全函数,新版本的VS会提示错误。可以使用localtime_s替代。

localtime_s(struct tm * _Tm, const time_t * _Time);

(责任编辑:IT教学网)

更多