Korrekte Überprüfung angelegten Speichers?!?
-
Hallo,
ich allokiere in einer Klasse dynamisch Speicher.usigned int *m_puiErrIDs; m_puiErrIDs = new unsigned int[VARIABLE_AMOUNT];
In dem Destruktor frage ich so ab:
if(m_puiErrIDs) delete[] m_puiErrIDs;
Wenn ich mir die Variable selber anschaue, dann ist die ja zu Beginn gar nicht 0 sondern m_puiErrIDs = 0xcdcdcdcd.
Gibt es dafür ein Makro?
Denn, wenn ich die Überprüfung so hinschreibe:if(m_puiErrIDs == 0xcdcdcdcd)
, dann erscheinen folgende Fehlermeldungen:
error C2446: '!=' : no conversion from 'unsigned int' to 'unsigned int*'
error C2040: '!=' : 'unsigned int *' differs in levels of indirection from 'unsigned int'MfG,
Paul.
-
Paul_C. schrieb:
Wenn ich mir die Variable selber anschaue, dann ist die ja zu Beginn gar nicht 0 sondern m_puiErrIDs = 0xcdcdcdcd.
Gibt es dafür ein Makro?Jein, das macht VC für dich, weil du die nicht initialisiert hast.
Zeiger muss man sofort initialisieren, also entweder:usigned int *m_puiErrIDs = new unsigned int[VARIABLE_AMOUNT];
oder
usigned int *m_puiErrIDs = NULL; m_puiErrIDs = new unsigned int[VARIABLE_AMOUNT];
Dann gibts auch kein 0xcdcdcdcd mehr.
-
Ja, das mit der 0 habe ich auch schon herausgefunden. Dachte aber, dass wäre eher ein Workaround und könnte es mir ersparen.
Dann mache ich das also so.
Danke für die Hilfe!MfG,
Paul.
-
Paul_C. schrieb:
In dem Destruktor frage ich so ab:
if(m_puiErrIDs) delete[] m_puiErrIDs;
Die Prüfung ist unnötig, delete([]) 0 tut nichts.
-
Hm, gut zu wissen. Habe es selber noch nie ausprobiert.
Danke.
-
MFK schrieb:
Paul_C. schrieb:
In dem Destruktor frage ich so ab:
if(m_puiErrIDs) delete[] m_puiErrIDs;
Die Prüfung ist unnötig, delete([]) 0 tut nichts.
Bzw. wenn du es schön prüfen willst, solltest du es nach delete auch auf NULL setzen, sonst klappt das nicht.
-
Das leuchtet mir ein.
-
estartu schrieb:
Paul_C. schrieb:
Wenn ich mir die Variable selber anschaue, dann ist die ja zu Beginn gar nicht 0 sondern m_puiErrIDs = 0xcdcdcdcd.
Gibt es dafür ein Makro?Jein, das macht VC für dich, weil du die nicht initialisiert hast.
Hier muss zumindest noch erwähnt werden, dass dies nur in der Debug-Version passiert. In der Release-Version hat die Variable einen zufälligen Wert!!!
estartu schrieb:
Zeiger muss man sofort initialisieren
Und zwar i.d.R. im Konstruktor.
-
estartu schrieb:
Bzw. wenn du es schön prüfen willst, solltest du es nach delete auch auf NULL setzen, sonst klappt das nicht.
Das ist doch ein Member. Warum sollte man dem im Destruktor noch irgendwas zuweisen?
-
Im Destruktor ist das wohl nicht nötig. Ich muss es aber noch woanders in meiner Anwendung überprüfen und gegebenenfalls löschen.
@Jochen: Danke für die Info. Ist vielleicht banal, aber mir war das nicht bewusst.
MfG,
Paul.