У меня есть 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);
Эта строка подозрительна:
memcpy(dateTimeCopy, &calculatedTime, sizeof(tm));
Обратите внимание, что
dateTimeCopy
имеет тип struct tm *
, в то время как&calculatedTime
имеет тип struct tm **
,Вы, вероятно, имели в виду:
memcpy(dateTimeCopy, calculatedTime, sizeof(tm));
Как указано в комментарии выше, мы полностью отошли от использования localtime
функция. Он обращается к разделяемой памяти и, похоже, не сохраняет потоки или не имеет других проблем (по крайней мере, в clang / ios / mac os).
Мы переехали, чтобы использовать localtime_r
или аналогичные функции, которые, кажется, работают без проблем. Вот код, который я также разместил в самом Вопросе:
time_t dateTime(valueDateTime);
tm *dateTimeCopy = new tm();
localtime_r(&dateTime, dateTimeCopy);
Я также испытал сбои с местным временем. Я исправил сбой, используя функцию memcpy_s с местным временем, например:
time_t dateTime(getCurrentTimestamp());
tm calculatedTime;
memcpy_s(&calculatedTime,sizeof(tm),localtime(&dateTime),sizeof(tm));