Ich kann dieses Problem nicht in einem kleineren Programm replizieren, das ich zeigen kann, also werde ich die Frage mit Screenshots illustrieren.
Ich habe eine Klasse, die eine Union und ein statisches Mitglied der Union deklariert:
%Vor% Ich habe dann eine Funktion, die die Adresse der Zeichenfolge zurückgibt. Zu Debuggingzwecken habe ich die Variable address
hinzugefügt, damit ich sie zum Überwachungsfenster hinzufügen kann. Hier ist die Funktion ( T
hier ist ein char8
wobei char8
ein typedef für char
ist):
Wie Sie sehen können, hatte ich anfangs die eine return-Anweisung, die ich auskommentiert habe, damit ich das Snippet debuggen kann. Die andere Zeile, die auskommentiert wird, nimmt die Adresse des ersten (und einzigen) Elements des Arrays; Diese auskommentierte Zeile macht dasselbe wie die vorhergehende Zeile: const char8* address = sm_emptyString.m_Empty8;
.
Das Programm stürzt ab, weil ich nicht die richtige Adresse durch die obige Funktion bekomme und das hat mich überholt. Im Folgenden werde ich Screenshots meiner Debugging-Sitzung starten:
Oben sehen Sie, dass ich kurz vor dem Kopieren der Adresse in den Zeiger brich. Im Folgenden sind die Werte des Überwachungsfensters für sm_emptyString
und address
bei dieser Unterbrechung aufgeführt.
Bisher nichts Besonderes. Unten ist der Screenshot nach dem Überschreiten einer Codezeile.
Und das entsprechende Überwachungsfenster:
Wie Sie sehen, ist der kopierte Wert in address
falsch. Eine andere Sache, die zu beachten ist, ist, dass diese Funktion einige Male aufgerufen wird und die Kopie der Adresse der statischen Variablen in address
korrekt ist. Wenn die Adresse falsch ist und von der Funktion zurückgegeben wird, stürzt mein Programm ab (wegen der Annahmen über die Adresse später im Programm).
Was passiert hier? Überschreibe ich irgendwo die Erinnerung? Wie gehe ich über das Debuggen dieses?
BEARBEITEN:
Die Disassemblierung (entsprechend dem Debugger ist die Adresse von sm_emptyString
129F184
, anders als die Disassemblierung zeigt, die 128F134
ist):
Was ich verwende: Windows 7, VC ++ 2008, Debug-Build
Verwenden Sie eine Funktion? Die leere Zeichenfolge, die Sie benötigen, hat nichts mit StringBase<T>
, seinem Status oder seinem Template-Argument zu tun.
BEARBEITEN: Warum schlage ich vor, dass die Verwendung von Union wie der Code falsch ist? Einige Dinge, die der C99-Standard sagt:
Das gleiche gilt für C ++, haben Sie jetzt nicht das Standardhandy. Sie können also nicht union verwenden, um 3 Strings gleichzeitig am gleichen Ort zu speichern. Während ich mir nicht sicher bin, was eigentlich die Probleme verursacht, ist es wahrscheinlich völlig anderswo, du solltest solche fragwürdigen Konstrukte loswerden.