Warum wird der Konstruktor std :: string zurückgesetzt? GetLastError
Ich rufe Windows-APIs aus C ++ - Code auf und habe eine Hilfsmethode, mit der ich das @ ausführen kanFormatMessage
Stuff und werfen eine Ausnahme für die Fehlerbehandlung. Die Signatur der Funktion ist
void throw_system_error(const std::string& msg_prefix, DWORD messageid)
Ich habe etwas merkwürdiges bemerkt. Dieser Code funktioniert nicht richtig:
handle = ...;
if (handle == NULL) {
throw_system_error("something bad happened", GetLastError());
}
Der Fehlercode, der an @ übergeben withrow_system_error
ist immer Null.
Wo das gut funktioniert:
handle = ...;
if (handle == NULL) {
DWORD error = GetLastError();
throw_system_error("something bad happened", error);
}
Etwas mehr Nachforschungen haben ergeben, dass diese Version das gleiche Problem hat:
handle = ...;
if (handle == NULL) {
std::string msg("something bad happened");
DWORD error = GetLastError();
throw_system_error(msg, error);
}
s sieht für die ganze Welt so aus, als ob der Konstruktor vonstd::string
setzt den Fehlercode zurück.
Meine Vermutung wäre, dassstd::string
reserviert intern Speicher, wodurch ein Systemaufruf ausgelöst wird, der den letzten Fehler auf Null zurücksetzt.
Weiß jemand was hier eigentlich los ist?
Visual C ++ 2015, 64 Bit.