Frage wegen delete[] - funktion
-
ich versehe garnicht, warum der befehl delete[] lautet, es werden nur float* variablen reingeworfen, an keiner stelle arrays. aber danke schonmal.
-
beinando123 schrieb:
ich versehe garnicht, warum der befehl delete[] lautet, es werden nur float* variablen reingeworfen, an keiner stelle arrays. aber danke schonmal.
Weriden die floats mit new float[] oder mit new float allokiert? zu new float[] gehört delete[] und zu new gehört delete.
-
beinando123 schrieb:
ich versehe garnicht, warum der befehl delete[] lautet, es werden nur float* variablen reingeworfen, an keiner stelle arrays.
Du glaubst anscheinend, delete wäre für Zeiger und delete[] für Arrays. Das ist nicht der Fall. Beide sind für Zeiger. delete ist für Zeiger auf Speicher, der mit new geholt wurde. delete[] ist für Zeiger auf Speicher, der mit new[] geholt wurde.
-
ah doch sie sind als array angelegt, mein fehler.
-
okay ich habe den bug behoben, danke nochmal!
-
Die beste Rettung für SA
VFE_DELETE#define SAFE_DELETE(x) delete[] x
Dann ist wenigstens das dumme Pointer nullen Geschichte und du kannst mit Debugwerkzeugen & Programmabstürzen Programmierfehlen auf die Spur kommen.
-
Wie waere es mit:
#define SAFE_DELETE(x) { delete[] x; reinterpret_cast<int&>(x) = 0xC0FFEE; }
-
Kellerautomat schrieb:
Wie waere es mit:
#define SAFE_DELETE(x) { delete[] x; reinterpret_cast<int&>(x) = 0xC0FFEE; }
0xC0FFEE ist Java .
-
Kellerautomat schrieb:
Wie waere es mit:
#define SAFE_DELETE(x) { delete[] x; reinterpret_cast<int&>(x) = 0xC0FFEE; }
Der Cast steht auf der falschen Seite der Zuweisung.
Mitreinterpret_cast<const void*&>(x) = reinterpret_cast<void*>(0xC0FFEE);
kommst du evtl. davon.
-
Kellerautomat schrieb:
Wie waere es mit:
#define SAFE_DELETE(x) { delete[] x; reinterpret_cast<int&>(x) = 0xC0FFEE; }
Warum nicht als Inline-Funktion? Wo ist die Unterscheidung zwischen Array-Löschen und Einzelobjekt-Löschen? So verführt es dazu, daß man aus falsch verstandenem Sicherheitsglauben immer SAFE_DELETE aufruft und ein vormals korrekted delete jetzt zum delete[] macht. x zu klammen, wäre eine feine Idee.
Natürlich geht wird trotzdem die Funktion geändert, zum Beispiel geht nicht mehr
pWindow->Close(); SAFE_DELETE_SINGLE_OBJECT(pWindow); unregister(pWindow);
Aber macht ja nichts, wir sind ja pfiffig.
Window* deadWindow=pWindow; pWindow->Close(); SAFE_DELETE_SINGLE_OBJECT(pWindow); unregister(deadWindow);
-
Man möchte ja nur sein SAFE_DELETE unschädlicher machen ... mit minimalem Arbeitsaufwand.
Aber stimmt:
template<typename T> void SAFE_DELETE(T*& ptr) { delete[] ptr; ptr = (T*)-1; }
Perfekt um Abstürze zu erzwingen.