ich habe hier gerade ein moderat interessantes Problem, dass das Starten meines Spiels verhindert. Folgende Klasse:
Code: Alles auswählen
/// Verwaltet alle Konsolenbefehle. Konsolenbefehle können an beliebigen Stellen mittels Helfermakro angelegt werden
/// und registrieren sich im Konstruktor bei der globalen Instanz dieser Verwaltung.
class KonsoleBefehlVerwaltung {
static bool sIstInitialisiert; // = false
std::map<std::string, const Befehl*>* mBefehle;
/// Standardkonstruktor
KonsoleBefehlVerwaltung() { /* nix */ }
void MeldeBefehlAn( const Befehl* derda)
{
if( !sIstInitialisiert ) { sIstInitialisiert = true; mBefehle = new std::map<std::string, const Befehl*>; }
mBefehle->insert( std::make_pair( derda->GetName(), derda));
}
Der spannende Teil ist, dass je nach globaler Konstruktor-Reihenfolge die ersten x irgendwo angelegten Konsolenbefehle sich sauber anmelden können. Und dann läuft plötzlich der Konstruktor der Verwaltungsklasse UND NULLT DEN ZEIGER. Das schließe ich aus einem Datenbreakpoint, der in "Editor_Debug.exe!KonsoleBefehlVerwaltung::__autoclassinit(unsigned int)" hält. Was zur Hecke? Hab ich da was verpasst? Müsste der Konstruktor den Zeiger nicht einfach in Ruhe lassen? Der nächste Aufruf der Anmelde-Funktion crasht dann natürlich.
Kann jemand mit Einblick in den C++-Standard sagen, ob das hier korrektes Verhalten ist oder ob das ein Compiler-Problem ist? Mich verwundert hier dran vieles... z.B. die Tatsache, dass diese Klasse antik ist und unter GCC3.xy und aufwärts, Visual Studio 6 und aufwärts und selbst unter StormC (Bonuspunkte, wer das kennt) schon kompiliert und funktioniert hat. Der Code ist über 10 Jahre alt! Verwunderlich auch, dass der selbe Code mittels SVN:external in anderen Projekten eingebunden und mitkompiliert sauber funktioniert, nur hier nicht. Und zuletzt: warum meint der Debugger, dass der Konstruktor einen Integer als Parameter nimmt? Die Klasse hat nur den Standard-Konstruktor ohne Parameter.
Ich schreibe das jetzt um, dass es zuverlässig funktioniert. Aber ich mache mir schon Gedanken, ob hier irgendein Vorgang waltet, den ich noch nicht kenne, und die letzten Jahre Lauffähigkeit nur ein Zufall waren.