Speicherreservierung läuft Amok
-
tmp_obj = NULL; // <-- was soll das hier? delete [] tmp_obj;liegt es evtl daran?
-
Danke, jetzt geht es, habe nur die Zeilen getauscht und alles ist normal.
-
Die letzten beiden Beiträge zeigen's schon, wenn du den Pointer VOR dem Löschen auf NULL setzt, dann hast du ein Ressourcenleck. NACH dem löschen kannst du den Pointer auf NULL setzen, zur Sicherheit.
-
GPC schrieb:
NACH dem löschen kannst du den Pointer auf NULL setzen, zur Sicherheit.
dann ist aber auch schon wieder etwas schiefgelaufen, wenn ein zeiger zweimal deleted wird. deshalb sollte man einen zeiger nicht auf 0 setzen, damit soetwas entdeckt wird.
btw gibt es "NULL" in c++ eigentlich nicht.
mfg
-
btw gibt es "NULL" in c++ eigentlich nicht.
aber eigentlich doch
-
wirsch schrieb:
aber eigentlich doch
wenn man sich ein makro baut:
Die C++ Programmiersprache, Seite 96 schrieb:
In C war es populär, ein Makro NULL zu definieren, um den Nullzeiger zu representieren. [...] Wenn Sie meinen, NULL definieren zu müssen, dann...
Folglich gibt es kein NULL in C++.
mfg
-
Im C++ Standard steht das hier:
#define NULL 0
Also es gibt NULL, auch in C++.
Eine Diskussion über NULL oder 0 gibt's in den FAQ
Gruß
-
terraner schrieb:
dann ist aber auch schon wieder etwas schiefgelaufen, wenn ein zeiger zweimal deleted wird. deshalb sollte man einen zeiger nicht auf 0 setzen, damit soetwas entdeckt wird.
Auf 0 setzen ist durchaus legitim und oft sehr zu empfehlen. Wenn man in einer Klasse die Invariante "Pointer ist entweder gültig oder 0" festlegt, dann kann man ihn sofort nach dem delete auf 0 setzen und gewährleistet damit die Sicherheit der Klasse beim Auftreten von Exceptions.
struct some_stupid_class { A *a; some_stupid_class(): a(new A[10]) { } ~some_stupid_class() { delete[] a; } void resize(int n) { delete[] a; a = 0; a = new A[n]; } };Wenn nun der Constructor von A eine Exception wirft und du das "a=0" weglässt, crasht das Ding im Destruktor.
-
Ringding schrieb:
Auf 0 setzen ist durchaus legitim und oft sehr zu empfehlen. Wenn man in einer Klasse die Invariante "Pointer ist entweder gültig oder 0" festlegt, dann kann man ihn sofort nach dem delete auf 0 setzen und gewährleistet damit die Sicherheit der Klasse beim Auftreten von Exceptions.
struct some_stupid_class { A *a; some_stupid_class(): a(new A[10]) { } ~some_stupid_class() { delete[] a; } void resize(int n) { delete[] a; a = 0; a = new A[n]; } };Wenn nun der Constructor von A eine Exception wirft und du das "a=0" weglässt, crasht das Ding im Destruktor.
stimmt. aber wie oft schreibt man schon selber eine klasse, die dynamisch speicher anfordert? in 99% der fälle würde ich dieses problem der stl/... überlassen
mfg
-
nie
-
7H3 N4C3R schrieb:
Eine Diskussion über NULL oder 0 gibt's in den FAQ

*davonschleich*
mfg
-
Ringding schrieb:
terraner schrieb:
dann ist aber auch schon wieder etwas schiefgelaufen, wenn ein zeiger zweimal deleted wird. deshalb sollte man einen zeiger nicht auf 0 setzen, damit soetwas entdeckt wird.
Auf 0 setzen ist durchaus legitim und oft sehr zu empfehlen. Wenn man in einer Klasse die Invariante "Pointer ist entweder gültig oder 0" festlegt, dann kann man ihn sofort nach dem delete auf 0 setzen und gewährleistet damit die Sicherheit der Klasse beim Auftreten von Exceptions.
struct some_stupid_class { A *a; some_stupid_class(): a(new A[10]) { } ~some_stupid_class() { delete[] a; } void resize(int n) { delete[] a; a = 0; a = new A[n]; } };Wenn nun der Constructor von A eine Exception wirft und du das "a=0" weglässt, crasht das Ding im Destruktor.
könnte sein, daß man durch umsortieren diese zuweisung immer wegkriegt.
struct some_stupid_class { A *a; some_stupid_class(): a(new A[10]) { } ~some_stupid_class() { delete[] a; } void resize(int n) { A* newA=new A[n]; a=newA; delete[] newA; } };
-
Ist aber auch nicht kürzer :p