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* без копирования