在localtime()崩溃,但gmtime()工作

时间:2014-07-22 09:44:36

标签: c++ time crash exc-bad-access localtime

我在下面的函数中有一个EXC_BAD_ACCESS:

time_t dateTime(getCurrentTimestamp());
tm *calculatedTime;
calculatedTime = localtime(&dateTime); 
tm *dateTimeCopy = new tm();
memcpy(dateTimeCopy, calculatedTime, sizeof(tm));
return dateTimeCopy;

EXC_BAD_ACCESS发生在localtime()中。哪个我无法解释。如果我将当地时间更改为gmtime,它工作得很好。这种行为可能是什么原因?

编辑:修正了此代码中的错误。正如Rufflewind所说。然而,崩溃仍然存在。

编辑2:使用localtime_r它也可以正常工作。我可能会最终使用它,如下所示:

time_t dateTime(valueDateTime);
tm *dateTimeCopy = new tm();
localtime_r(&dateTime, dateTimeCopy);

3 个答案:

答案 0 :(得分:3)

这一行很可疑:

memcpy(dateTimeCopy, &calculatedTime, sizeof(tm));

请注意

  • dateTimeCopy的类型为struct tm *,而
  • &calculatedTime的类型为struct tm **

你可能意味着:

memcpy(dateTimeCopy, calculatedTime, sizeof(tm));

答案 1 :(得分:0)

正如上面的评论所述,我们完全不使用localtime功能。它访问共享内存,似乎不是线程保存或有其他问题(至少在clang / ios / mac os中)。

我们开始使用localtime_r或类似功能,这些功能似乎没有问题。以下是我在问题本身中发布的代码:

time_t dateTime(valueDateTime);
tm *dateTimeCopy = new tm();
localtime_r(&dateTime, dateTimeCopy);

答案 2 :(得分:0)

我也遇到了当地时间的崩溃。我通过将memcpy_s函数与本地时间配合使用来解决了崩溃问题,例如:

time_t dateTime(getCurrentTimestamp());
tm calculatedTime;
memcpy_s(&calculatedTime,sizeof(tm),localtime(&dateTime),sizeof(tm));