localtime vs localtime_s: соответствующие аргументы ввода
Вопрос по поводу использования функции localtime
и localtime_s
в C++
Я столкнулся с проблемой при работе с функциями localtime
и localtime_s
в C++. Вот мой код:
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
При компиляции я получаю предупреждение:
warning C4996: 'localtime': Эта функция или переменная может быть небезопасной. Рассмотрите возможность использования localtime_s вместо нее.
Когда я заменяю localtime
на localtime_s
, код выглядит так:
time_t rawtime;
struct tm timeinfo;
time ( &rawtime );
localtime_s ( &timeinfo, &rawtime );
Однако я получаю ошибку:
error C2660: 'localtime_s': функция не принимает 1 аргумент
Мои предположения относительно первого блока кода:
- я создаю пустую переменную типа
time_t
. - я создаю указатель на
timeinfo
, который определён вctime
. - я записываю текущее время в переменную
rawtime
. - затем я конвертирую
rawtime
в что-то более понятное.
Вопросы:
- Правильно ли я понимаю, что происходит в первом блоке кода?
- Какой второй параметр нужен функции
localtime_s
? - Какие последствия могут быть, если я просто проигнорирую вопрос безопасности функции
localtime
?
Спасибо за помощь!
1 ответ(ов)
localtime
возвращает указатель на статически выделенную структуру tm
, что может приводить к проблемам с многопоточностью, так как вызовы этой функции из разных потоков могут перезаписывать данные.
Вместо этого, вы можете использовать localtime_s
, которая требует указатель на вашу структуру tm
в качестве аргумента. Это позволяет записывать данные непосредственно в ваш буфер вместо использования внутреннего буфера функции. Ваш код изменится с:
struct tm *timeinfo;
timeinfo = localtime(&rawtime);
на что-то вроде:
struct tm timeinfo;
localtime_s(&timeinfo, &rawtime);
Таким образом, вы избегаете проблем с многопоточностью, так как localtime_s
записывает результат в вашу структуру, а не использует свою собственную статическую память.
Как удалить элемент из std::vector<> по индексу?
`unsigned int` против `size_t`: когда и что использовать?
Какова разница между "new", "malloc" и "calloc" в C++?
Что означает && в конце сигнатуры функции (после закрывающей скобки)?
Инициализация std::string из char* без копирования