Das Kopieren der Adresse eines statischen Union-Members ergibt die falsche Adresse

9

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):

%Vor%

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):

%Vor%

Was ich verwende: Windows 7, VC ++ 2008, Debug-Build

    
Samaursa 23.09.2012, 23:11
quelle

1 Antwort

2

Verwenden Sie eine Funktion? Die leere Zeichenfolge, die Sie benötigen, hat nichts mit StringBase<T> , seinem Status oder seinem Template-Argument zu tun.

%Vor%

BEARBEITEN: Warum schlage ich vor, dass die Verwendung von Union wie der Code falsch ist? Einige Dinge, die der C99-Standard sagt:

  • 6.2.5p20, Union hat eine überlappende Gruppe von Member-Objekten
  • 6.7.2.1p14, der Wert von höchstens einem der Mitglieder kann jederzeit in einem Union-Objekt gespeichert werden
  • Anhang J.1 Der Wert eines anderen Gewerkschaftsmitglieds als des zuletzt gespeicherten ist nicht spezifiziert.

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.

    
Öö Tiib 24.09.2012 00:51
quelle

Tags und Links