ZeroMemory und CStrings = Game over ???
-
Aloha,
warum funzt folgender Quellcode net ?
Was macht ZeroMemory im Hintergrund, was ich net begreife ?
CString test = "Hilfe"; ZeroMemory(&test,sizeof(CString)); test = "123"; <--- GAME OVERGrüße
BOA
-
Servus,
vorab, es ist nur eine Vermutung. Erlaubnis zum Schlagen bei gegebenen Fehler ist erteilt!!!
Mit CString test legst du ja eine neue Variable an und gibst ihm auch eine Speicheradresse. Wenn du aber nun ZeroMemory aufrufst, zeigt danach der Zeiger von test ins leere -> Und fott isser....
Frage Allgemein:
Macht eigentlich "delete" nicht dasselbe?*winke*
HellsgoreEDIT:
Warum willste das überhaupt machen???
-
ZeroMemory() setzt den ganzen speicher den du der funktion gibst auf 0.
das mit structs zu machen is eine sache.
aber mit klassen is das nicht zu empfehlen.
ich denke mal dass du damit innerhalb von deiner CString instanz irgendeinen zeiger = 0 setzt und das natürlich früher oder später zu einem fehler führt.auch kann es passiern, dass du bei klassen, die von einer anderen klasse abgeleitet sind und virtuelle funktionen usw. besitzen die zeiger in der _vtable auf null setzt ( is mir in meiner anfagszeit mal passiert ). recht unangenehm und wenn man noch nicht viel ahnung davon hat recht lustig zu debuggen

aber ich hab den fehler ja dann doch gefunden...
-
ZeroMemory = memcpy nur das der 2 Parameter von memcpy = 0 ist.
Wenn du den CString leeren willst dann nimm die Memberfunktionen dafür.
z.B. Empty()
-
fast gleichzeitig

Hellsgore schrieb:
Frage Allgemein:
Macht eigentlich "delete" nicht dasselbe?nein, delete gibt speicher frei ( die C++ version von free() ), ZeroMemory() setzt ihn nur auf 0.
-
Servus,
dot schrieb:
nein, delete gibt speicher frei ( die C++ version von free() ), ZeroMemory() setzt ihn nur auf 0.
Schankedön.... Man lernt nie aus

Hellsgore
-
Aloha,
vielen Dank für die zahlreichen Antworten.
Empty() is mir wohl bekannt gewesen, mein Prob war, daß ich in einer Struktur eine CString - Variable hatte, und die ganze Struktur nullen wollte auf einen Schlag.
struct verbraucher{ CString name; int zyklus; CTime termin; BOOL kill; };Die Struktur sieht ja nach dem ZeroMemory auch spitze aus.
ZeroMemory(&t_verbraucher,sizeof(verbraucher));t_verbraucher.name = "";
zeigt mir der Debugger an.
Wenn die Struktur am Ende der Funktion allerdings gelöscht wird, meckert der Compiler.
So richtig begreife ich immer noch nicht, warum er meckert.

Naja, nun nulle ich per Hand jede einzelne Variable, sodaß ich Empty() benutzen kann.
Grüße und Danke
BOA
-
Wie ja schon erwähnt wurde, ist es nie eine gute Idee eine Klasse mit ZeroMemory/memset.. zu initialisieren. Dafür ist ja der Konstruktor da. Die Klasse hat ja auch immer, wie eine Struktur, einen Datenbereich im Speicher. In deinem Beispiel erstellst du ein Objekt vom Typ CString. Dieses enthält "nur" einen Zeiger auf den vom CString Objekt verwalteten Text. Dieser wird standardmäßig vom Konstruktor initialisiert. Es wird also (beim Standardkonstruktur) Speicher für einen Leerstring reserviert, auf den der Zeiger des CString Objektes verweist. Sobald das CString Objekt versucht, den alten Text freizugeben (z.B. wenn ein neuer gespeichert werden soll oder das CString Objekt durch den Destruktor zerstört werden soll), stürzt ein Program ab, weil der Zeiger des CStrings auf 0x00000000 verweist und versucht diese freizugeben.
-
Aloha,
@homes
aller klar, das klingt einleuchtend.Danke für die Erklärung.
Grüße
BOA