我正在从C++代码中调用Windows API,并且有一个帮助方法来执行FormatMessage
的操作并抛出异常以进行错误处理。该函数的签名为:
void throw_system_error(const std::string& msg_prefix, DWORD messageid)
我注意到了一些奇怪的事情。这段代码不能正常工作:
handle = ...;
if (handle == NULL) {
throw_system_error("something bad happened", GetLastError());
}
传递给 throw_system_error
的错误代码始终为零。
而这个可以正常工作:
handle = ...;
if (handle == NULL) {
DWORD error = GetLastError();
throw_system_error("something bad happened", error);
}
进一步调查发现,此版本存在相同的问题:
handle = ...;
if (handle == NULL) {
std::string msg("something bad happened");
DWORD error = GetLastError();
throw_system_error(msg, error);
}
看起来就像是std::string
的构造函数正在重置错误代码。
我的猜测是std::string
在内部分配内存,这会导致某些系统调用,然后将最后一个错误代码设置为零。
有人知道这里实际发生了什么吗?
Visual C++ 2015,64位。
GetLastError
。显然,分配内存的调用可能会调用SetLastError
。我相当确定这个问题以前已经在这里问过了。 - David Heffernanmalloc
超出了MSDN Win32文档的范围。它可以随心所欲地做任何事情。 - David Heffernancatch
子句中实现相应的代码。 - IInspectable