Компиляции с использованием `std :: string` вызывают ошибку Windows

Минимальный пример:

#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.

Ожидается ли такое поведение? Если нет, могу ли я получить некоторые подтверждения (тогда я отправлю отчет об ошибке)?

1

Решение

GetLastError() возвращает последний код ошибки, который будет установлен функцией WinAPI, вызываемой этим потоком. Обратите внимание, что функции WinAPI делают не обязательно установить код, когда им это удастся:

Большинство функций вызывают SetLastError или SetLastErrorEx, только когда они терпят неудачу.

Вы не вызвали функцию WinAPI, которая потерпела неудачу. Таким образом, код ошибки является неопределенным. Он либо неинициализирован (имеется в виду неопределенное поведение), либо устанавливается неизвестной функцией (только чуть менее бессмысленно). Стандартная библиотека использует исключения для оповещения об ошибках, а не Windows API.


«Это поведение ожидается?»

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

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]