Создание двух значений time_t в тот же день с использованием gmtime и mktime, ошибка «функция может быть небезопасной»

1) Вы сказали:

Кажется, что когда есть статические объекты, _CrtDumpMemoryLeaks возвращает ложное положительное утверждение о том, что это утечка памяти.

Я не думаю, что это правильно. EDIT: Статические объекты не создаются в куче. END EDIT: _CrtDumpMemoryLeaks охватывает только кучу памяти crt. Поэтому эти объекты не должны возвращать ложные срабатывания. Однако, другое дело, если статические переменные являются объектами, которые сами хранят некоторую кучную память (если, например, они динамически создают объекты-члены с помощью operator new()).

2) Рассмотрим использование _CRTDBG_LEAK_CHECK_DF, чтобы активировать утечку памяти проверьте в конце выполнения программы (это описано здесь: http://msdn.microsoft.com/en-us/library/d41t22sb (VS.80) .aspx ). Я полагаю, что проверка утечки памяти выполняется даже после завершения статических переменных.

0
задан Daniel Peedah 13 July 2018 в 09:35
поделиться

1 ответ

Из gmtime документации :

Возвращаемое значение указывает на статически выделенную структуру, которая может быть перезаписана последующими вызовами любой из функций даты и времени .

ОК, это была документация по Linux, но поведение в Windows одинаково.

И вы столкнулись с проблемой:

tm* then = gmtime(&startTime);
cout << (then->tm_hour);
tm* now = gmtime(&eventTime);

then и now оба указывают на один и тот же объект! Таким образом, вы теряете информацию с первого вызова go gmtime, который перезаписывается вторым вызовом!

MSVC пытается спасти вас от этой ошибки, просто не позволяя использовать gmtime по умолчанию. Чтобы отключить предупреждение / ошибку, вам нужно использовать макрос, который отображается в ошибке: _CRT_SECURE_NO_WARNINGS. Либо #define это прямо в начале, прежде чем включать заголовок или добавить его в качестве определения предварительного процессора в настройках проекта IDE.

Сторона примечания: Правильное решение вашей ошибки:

tm then = *gmtime(&startTime);
tm now = *gmtime(&eventTime);
1
ответ дан Aconcagua 17 August 2018 в 13:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: