Возвращает указатель на фрагмент статически выделенной памяти (вероятно, это либо переменная static
, определенная внутри localtime
, либо глобальная переменная, определенная где-то в библиотеке времени выполнения C).Вы не должны освобождать такую память.
Очевидно, что эта функция не реентерабельна (но может быть поточно-ориентированной, если используется TLS).
Вы должны быть осторожны при использовании этого указателя: никогда не создавайте никакихвызовы функций, которые могут вызывать localtime
/ gmtime
/ ... до того, как вы закончите использовать этот указатель, в противном случае содержимое памяти, на которое ссылается указатель, может измениться (в ответ на новый вызов localtime
), и вычитать значения относительно другого time_t
.
В целом, дизайн библиотеки даты / времени довольно устарел, такого рода оптимизация стоила того, когда разрабатывался язык C, в настоящее время он только создает проблемы.
Для решения этих проблем существуют как минимум две различные улучшенные версии этих функций: localtime_r
(SUSv2, r
остается для «реентерабельного») и localtime_s
(Microsoft, s
остается для «безопасного»«).Печальный факт переносимости состоит в том, что они выполняют почти одно и то же (они требуют, чтобы пункт назначения struct tm
передавался как параметр), но различаются по имени и порядку расположения параметров.