2017-07-14 89 views
1

小例子:汇编涉及'的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年

这种行为是正常吗?如果没有,我可以得到一些确认(然后,我将提交错误报告)?

+0

我假设的过程启动时在你的过程中遇到的最后一个错误。 – pm100

+0

如果字符串的构造实际上出了问题,那么您将更有可能遇到异常或动态链接器故障。 – cdhowie

+0

如果你注释掉'std :: string str;'你会得到相同的值吗?你在每次运行中也获得相同的价值吗? – NathanOliver

回答

6

GetLastError()返回由该线程调用的WinAPI函数设置的最后一个错误代码。需要注意的是WinAPI的功能并not necessarily设置代码时,他们成功:

大多数函数调用SetLastError或SetLastErrorEx只有当他们失败。

你不叫失败一个WinAPI的功能。因此,错误代码是不确定的。它或者是未初始化的(意思是未定义的行为),或者是由未知函数设置的(只是稍微没有意义)。标准库使用异常来表示错误,而不是Windows API。


“这是行为吗?”

由于该函数未在正确的上下文中使用,因此该行为预期值的任何值都可接受。

+0

这是有道理的。但是,在调用GetLastError()之前添加了一个WinAPI函数(请参阅编辑),问题依然存在。 – imallett

+0

@imallett尝试失败的函数。成功的功能不一定会设置错误代码。从[链接](https://msdn.microsoft.com/en-us/library/windows/desktop/ms680627(V = vs.85)的.aspx):*“大多数函数调用SetLastError或SetLastErrorEx只有当他们失败。 “*你也可以尝试用你想要的任何值自己调用SetLastError。 –

+0

更换线用'GetStdHandle(0)'使返回改变到'ERROR_INVALID_HANDLE',如预期的[编辑:好;(“句柄无效”)。你的编辑是有道理的。] – imallett