Hallo H☼psel
Der Fehler überholt die MessageBox nicht. Diese wird anstandslos angezeigt. Genauso, wie geplant. Allerdings kommt danach der hübsche Fehler. Es ist ein Debugfehler: "HEAP CORRUPTION DETECTED: [...] CRT detected that the application wrote to memory after end of heap buffer."
Na dann ist doch alles klar (vorausgesetzt wir sprechen beide von der MessageBox direkt hinter dem Kommentar //keine Grafikkarte - aber ich fürchte, du meinst die MessageBox am Ende der Schlaife...). Wenn die Fehlermeldung angezeigt wird, wird das Zeiger Array freigegeben. Später wird dann nochmals verucht, das Array freizugeben. Falls du zwei oder mehr Adapter hast, müßte der Fehler sogar schon innerhalb der Schleife auftreten (Falls der Aufruf zweimal "scheitert" ;-) ). Ansonsten halt nach Beenden der Schleife. Übrigens hast du ganz richtig angemerkt, dass du beim Behandeln des ersten Fehlers (Initialisierung des Direct3D Objektes fehlgeschlagen) ein "return 1" stehen hast. Der zweite Fehlerfall innerhalb der Schleife (Keine Grafikkarte vorhanden) führt bei dir aber nicht zum Abbruch der Schleife. Allerdings solltest du die Schleife verlassen, nachdem du ein delete ausgeführt hast, denn was passiert, wenn die Funktion mit einem bereits freigegebenen Zeiger aufgerufen wird kannst du dir denken.
Also:
if(FAILED(g_pD3D->GetAdapterIdentifier(0, 0, &g_pAdapters[g_iNumAdapters]))) {
// Keine Grafikkarte
MessageBox(NULL, "Keine Grafikkarte gefunden.", "Achtung!", MB_OK | MB_ICONEXCLAMATION);
// Direct3D freigeben
g_pD3D->Release();
delete[] g_pAdapters;
//ergaenzung von mbr
g_pAdapters=NULL;
break;
}
mit freundlichem Gruß
mbr
P.S.: cool, scheint ja zu klappen mit der Quellcodeausgabe (SELF auf die Schulter klopf)