C++ 涉及'std::string'的编译导致Windows错误状态

C++ 涉及'std::string'的编译导致Windows错误状态,c++,string,windows,getlasterror,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;

最简单的例子:

#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
}
#包括
#包括
int main(int/*argc*/,char*/*argv*/[]){
HANDLE HANDLE=GetStdHandle(STD_OUTPUT_HANDLE);//行为相同,带或不带。
DWORD err=GetLastError();
std::字符串str;
return(int)err;//返回127 iff行,未注释,0 iff注释
}
此程序返回
127
,它对应于
ERROR\u PROC\u NOT\u FOUND
(“找不到指定的过程”)。请注意,
err
是在创建
std::string
之前设置的。该程序使用MSVC 2017在调试模式下编译

这是预期的行为吗?如果没有,我可以得到一些确认(然后,我将提交一个bug报告)

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

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

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


“这是预期的行为吗?”

由于函数未在正确的上下文中使用,因此该行为在某种意义上是可以接受的。

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

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

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


“这是预期的行为吗?”


由于函数未在适当的上下文中使用,因此该行为在某种意义上是可以接受的。

我假定这是进程启动过程中遇到的最后一个错误。如果字符串的构造确实出现问题,您更有可能遇到异常或动态链接器故障是否得到相同的值?你每次跑步都得到相同的值吗?你真的有问题吗?在调用任何win32 API之前调用getlasterror显然是错误的meaningless@NathanOliver我总是得到
127
。如果我注释字符串行,我总是得到
0
。另外,作为参考,这是MSVC 2017。我假设这是进程启动期间在进程中遇到的最后一个错误。如果字符串的构造出现实际问题,则更有可能遇到异常或动态链接器故障。如果您注释掉
std::string str是否得到相同的值?你每次跑步都得到相同的值吗?你真的有问题吗?在调用任何win32 API之前调用getlasterror显然是错误的meaningless@NathanOliver我总是得到
127
。如果我注释字符串行,我总是得到
0
。另外,作为参考,这是MSVC 2017。这很有意义。但是,我在调用
GetLastError()
(请参见编辑)之前添加了一个WinAPI函数,问题仍然存在。@imallett请尝试一个失败的函数。成功的函数不一定设置错误代码。From:“大多数函数只有在失败时才调用SetLastError或SetLastErrorEx。”您也可以尝试自己调用
SetLastError
任何值。将行替换为
GetStdHandle(0)
会导致返回到
ERROR\u INVALID\u HANDLE
(“句柄无效”)。[编辑:好的;您的编辑是有意义的。]这是有意义的。但是,我在调用
GetLastError()
(请参见编辑)之前添加了一个WinAPI函数,问题仍然存在。@imallett尝试一个失败的函数。成功的函数不一定设置错误代码。从:“大多数函数只有在失败时才调用SetLastError或SetLastErrorEx。”您也可以尝试自己使用任何想要的值调用
SetLastError
。将行替换为
GetStdHandle(0)
会导致返回到
错误\u无效\u句柄(“句柄无效”)。[编辑:好的;您的编辑很有意义。]