【问题标题】:Compilations involving `std::string` cause Windows error status涉及 `std::string` 的编译会导致 Windows 错误状态
【发布时间】:2017-12-20 00:21:39
【问题描述】:

小例子:

#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 在调试模式下编译。

这种行为是预期的吗?如果没有,我能否得到一些确认(然后,我会提交错误报告)?

【问题讨论】:

  • 我假设它是您的进程在进程启动期间遇到的最后一个错误。
  • 如果字符串的构造确实出了问题,您更有可能遇到异常或动态链接器故障。
  • 如果您注释掉std::string str;,您会得到相同的值吗?此外,您每次运行都获得相同的值吗?
  • 你真的有问题吗?在调用任何 win32 API 之前调用 getlasterror 显然是没有意义的
  • @NathanOliver 我总是得到127。如果我评论字符串行,我总是得到0。另外,作为参考,这是 MSVC 2017。

标签: c++ string windows getlasterror


【解决方案1】:

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

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

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


“这是预期的行为吗?”

任何值都可以接受的意义上,该行为是预期的,因为该函数没有在适当的上下文中使用。

【讨论】:

  • 这是有道理的。但是,我在调用 GetLastError() 之前添加了一个 WinAPI 函数(请参阅编辑),问题仍然存在。
  • @imallett 尝试一个失败的函数。成功的函数不一定会设置错误代码。来自link“大多数函数只有在失败时才调用 SetLastError 或 SetLastErrorEx。” 您也可以尝试使用自己想要的任何值调用 SetLastError
  • GetStdHandle(0)替换行会导致返回更改为ERROR_INVALID_HANDLE(“句柄无效。”),正如预期的那样。[编辑:好的;你的编辑是有道理的。]
猜你喜欢
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 1970-01-01
  • 2015-11-18
相关资源
最近更新 更多