涉及`std :: string`的编译导致Windows错误状态

时间:2017-07-14 20:01:31

标签: c++ string windows getlasterror

最小例子:

#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(&#34;找不到指定的程序。&#34;)。请注意,在{/ 1>创建err之前,std::string已设置为。该程序使用MSVC 2017以调试模式编译。

预计会出现这种情况吗?如果没有,我可以得到一些确认(然后,我会提交错误报告)吗?

1 个答案:

答案 0 :(得分:6)

GetLastError()返回由此线程调用的WinAPI函数设置的最后一个错误代码。请注意,WinAPI函数在成功时会not necessarily设置代码:

  

大多数函数只在失败时调用SetLastError或SetLastErrorEx。

您尚未调用失败的WinAPI函数。因此,错误代码是不确定的。它要么是未初始化的(意味着未定义的行为),要么是由未知函数设置(仅略微不那么无意义)。标准库使用异常来指示错误,而不是Windows API。

“预期会出现这种情况吗?”

由于该函数未在适当的上下文中使用,因此任何值是可接受的意义上的行为是预期的。