Минимальный пример:
#include <Windows.h>
#include <string>
int main(int /*argc*/, char* /*argv*/[]) {
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //Behavior the same, with or without.
DWORD err = GetLastError();
std::string str;
return (int)err; //returns 127 iff line above uncommented, 0 iff commented
}
Эта программа возвращает 127
что соответствует ERROR_PROC_NOT_FOUND
(«Указанная процедура не найдена.»). Заметить, что err
установлено до std::string
создано. Программа скомпилирована в режиме отладки с MSVC 2017.
Ожидается ли такое поведение? Если нет, могу ли я получить некоторые подтверждения (тогда я отправлю отчет об ошибке)?
GetLastError()
возвращает последний код ошибки, который будет установлен функцией WinAPI, вызываемой этим потоком. Обратите внимание, что функции WinAPI делают не обязательно установить код, когда им это удастся:
Большинство функций вызывают SetLastError или SetLastErrorEx, только когда они терпят неудачу.
Вы не вызвали функцию WinAPI, которая потерпела неудачу. Таким образом, код ошибки является неопределенным. Он либо неинициализирован (имеется в виду неопределенное поведение), либо устанавливается неизвестной функцией (только чуть менее бессмысленно). Стандартная библиотека использует исключения для оповещения об ошибках, а не Windows API.
«Это поведение ожидается?»
Поведение ожидается в том смысле, что любой значение будет приемлемым, так как функция не используется в надлежащем контексте.
Других решений пока нет …