Warum funktionieren Pointer nach dem Löschen immer noch?
-
Dobi schrieb:
Das Verhalten ist sehr wohl definiert. Bei dir aufm Rechner wirds immer wunderbar laufen. Beim Kunden wirds dir peinlichst um die Ohren fliegen.

Wie ist es denn definiert?
-
icarus2 schrieb:
Dobi schrieb:
Das Verhalten ist sehr wohl definiert. Bei dir aufm Rechner wirds immer wunderbar laufen. Beim Kunden wirds dir peinlichst um die Ohren fliegen.

Wie ist es denn definiert?
Ich glaube du hast den Witz nicht verstanden. Das hier tatsächlich wohl definierte verhalten ist, dass mit Sicherheit Murphys Gesetz zuschlägt, wenn man undefiniertes Verhalten programmiert.
-
SeppJ schrieb:
icarus2 schrieb:
Dobi schrieb:
Das Verhalten ist sehr wohl definiert. Bei dir aufm Rechner wirds immer wunderbar laufen. Beim Kunden wirds dir peinlichst um die Ohren fliegen.

Wie ist es denn definiert?
Ich glaube du hast den Witz nicht verstanden. Das hier tatsächlich wohl definierte verhalten ist, dass mit Sicherheit Murphys Gesetz zuschlägt, wenn man undefiniertes Verhalten programmiert.
Achsooo
*Blush*
-
delete pointer;gibt nur den zugewiesenen Speicherbereich wieder frei, löscht aber nicht die Zeigervariabel, d.h. pointer zeigt immer noch auf die Adresse, auch wenn da jetzt nach der Freigabe sonst was drin stehen kann (undefiniert).
Deswegen ist es gut einen Zeiger nach der delete Funktion auf 0 zu setzen.delete pointer; pointer = 0; if (pointer == 0) { ... }Gruß, x3meblue
-
x3meblue schrieb:
Deswegen ist es gut einen Zeiger nach der delete Funktion auf 0 zu setzen.
I disagree

Wenn du so eine Logik verwendest, ist dein Design (meistens) in den Fritten.
-
Disagree schrieb:
I disagree

Wenn du so eine Logik verwendest, ist dein Design (meistens) in den Fritten.Sehe ich auch so. Lieber dafür sorgen, dass der Zeiger solange wie möglich gültig ist und nachher kein Zugriff mehr darauf erfolgt.
Auch
deletezu verwenden ist ein Hinweis darauf, dass man vielleicht besser RAII einsetzen würde.
-
x3meblue schrieb:
Deswegen ist es gut einen Zeiger nach der delete Funktion auf 0 zu setzen.
- delete Funktion gibts nicht.
- Es ist nicht unbedingt gut, einen Zeiger nach der delete-Funktion auf 0 zu setzen. Ausnahmen sind Zeiger, die Bestandteile von Objekten sind, und wo es in Ordnung ist, wenn die 0 sind. An allen anderen Stellen sollte der Scope so oder so kurz nach dem delete verlassen werden, der Pointer verschwinden und muss deshalb nicht "nullifiziert" werden.
-
soya_crack schrieb:
[...] warum unten stehender Code funktioniert und richtig läuft.
Die offensichtliche Erklärung fehlt imho: Weil Deine Definition von "funktioniert" falsch ist. Im gegebenen Beispiel bekommst Du nur _zufällig_ das Ergebnis, was Du erwartest, obwohl das Programm inkorrekt ist.
Das wäre etwas vergleichbar damit ein kaputtes Auto einen Berg runterrollen zu lassen und dann zu argumentieren, das Auto sei ja nicht kaputt weil es fährt.
-
Ja, da habe ich mich vielleicht etwas falsch ausgedrückt. Ich meinte natürlich "läuft" und nicht gleich abschmiert.
Danke für die prompten Antworten, war ja dann so wie ich es mir vorgestellt habe.
-
Das wäre etwas vergleichbar damit ein kaputtes Auto einen Berg runterrollen zu lassen und dann zu argumentieren, das Auto sei ja nicht kaputt weil es fährt.

-
@Disagree: Wäre gut, wenn du auch erklären könntest warum, dann hätten alle was davon, so ist dein Beitrag sowohl überflüssig als auch nutzlos.
Gruß, x3meblue
-
x3meblue schrieb:
@Disagree: Wäre gut, wenn du auch erklären könntest warum, dann hätten alle was davon, so ist dein Beitrag sowohl überflüssig als auch nutzlos.
Gruß, x3meblue
Er hat doch erklärt, dass es auf Designfehler hindeutet. Nexus hat bessere Alternativen genannt. Wenn bei deinem Programm überhaupt die Chance besteht, dass ein ungültiger Pointer gelöscht wird, dann ist schon was falsch. Und mit dem Nullsetzen verschleppst du den Fehler auch noch, wodurch er wesentlich schwerer zu finden ist. Überhaupt sollte ein ungültiger Pointer kurz vorm Ende seiner Lebenszeit stehen (siehe auch wieder Nexus).
Nullsetzen solltest du nur, wenn dies einen besonderen Wert des Pointers bedeutet der an anderer Stelle auch geprüft wird (und zwar nicht vom delete!) und der Pointer danach überhaupt noch weiterlebt, z.B. wird das in komplexen Datenstrukturen wie Binärbäumen oft gemacht.
-
sagt mal:
wieso ist es eigentlich sinnvoll (bzw nicht vom std vorgeschrieben) dass delete den zeiger nicht automatisch gleich mit auf 0 setzt?
-
Erstens kostet es ein wenig Performance und man bezahlt bekanntlich für nichts, was man nicht braucht.
Zweitens bekommst du kein konsistentes Verhalten hin:
int* x = new int; int* y = x; delete y; // x == 0?
-
Skym0sh0 schrieb:
wieso ist es eigentlich sinnvoll (bzw nicht vom std vorgeschrieben) dass delete den zeiger nicht automatisch gleich mit auf 0 setzt?
Wurde doch schon gesagt dass das 0 setzen des Zeigers gefährlich sein kann.
Warum sollte man das also wollen?Nie nie nie den Zeiger 0 setzen. Das fürht zu den blödsten Problemen...
-
Nun, an anderen Stellen hört man es umgekehrt, nämlich, das auf 0 setzen gängige Praxis und es eben nicht gefährlich ist. Scheint wohl so ein Thema zu sein, wo es geteilte Meinungen gibt und jeder selbst entscheiden muss. Aber gut, das war ja auch nicht das eigentlich Thema des Threads.
Grüßla, x3meblue
-
x3meblue schrieb:
Nun, an anderen Stellen hört man es umgekehrt,
Wenn du nicht auf 0 setzt und doppelt löscht stürzt dein Programm garantiert in der Testphase ab und du kannst den Bug fixen. Setzt du aber auf 0, stürtzt es garantiert nicht in der Testphase ab und du shipst den Bug zum Kunden.
Klar ist es verführerisch auf 0 zu setzen. Das bedeutet weniger entdeckte Bugs in der Testphase, das bedeutet weniger Arbeit. Aber es ist trotzdem eine schlechte Idee.
Lustigerweise höre ich diese auf 0 setzen Standpunkte nur von C++ Entwicklern. C Entwickler sind mir noch keine untergekommen die das gerne machen...
-
genau so kann man doch argumentieren, dass man auf einen gelöschten noch mal zugreift und es klappt.
wenn man ihn auf 0 gesetzt hätte, dann hätte es gleich geknallt.welcher bug landet denn beim kunden, wenn ich einen zeiger lösche, dann auf 0 stelle und noch mal lösche?
jenz
-
jenz schrieb:
welcher bug landet denn beim kunden, wenn ich einen zeiger lösche, dann auf 0 stelle und noch mal lösche?
Das mag im ersten Moment nicht als Bug erscheinen, aber grundsätzlich deutet es tendenziell auf Fehler oder Probleme hin, wenn man Variablen "recycled". Es mag Stellen geben wo es Sinn macht, dies sollte aber die Ausnahme nicht die Regel sein.
Zudem ist selbst verwaltete Zeiger eine Gefahrenquelle, häufig sind ("schlanke") Smartpointer die bessere Wahl (Ich spreche hier ausschließlich von der Verwaltung, nicht von ersetzen von Zeigerübergaben etc.).
-
was meinst du mit "recycled"
a) einen gelöschten pointer 0en und noch mal löschen
b) einen gelöschten pointer nicht 0en und noch mal benutzen?gerade b) würde man durch 0 setzen verhinden.
sowohl a) als auch b) sollte man natürlich nicht machen. kann aber bestimmt im eifer des gefechts mal passieren.
wenn, dann sollte es doch gleich in der entwicklungsphase knallen und da sehe ich b) als gefährlicher an als a)oder?
jenz