Zeigeränderung während Methodenaufruf
-
Hallo!
Ist das folgende Konstrukt laut C++ Standard erlaubt oder gibt es daran etwas auszusetzen?
Entry *Current = new Entry; Current->AddEntry(Current=new Entry); //Ist das erlaubt und hat es auch den Sinn den ich beabsichtige?
-
naja, so, wie ich das sehe, hast du dann ein speicherloch.
-
Original erstellt von Kräuterkundestudent:
naja, so, wie ich das sehe, hast du dann ein speicherloch.Nee das ist nicht das Problem, da AddEntry den Speicher vom übergebem Entryobjekt löscht und die Initialisierung von Current ist nur beispielhaft. Es gibt dann ein rootobjekt, dass alle seine Kinder löscht. Und die Kinder, die wieder Kinder haben löschen die natürlich auch...
Mir gehts nur darum ob es standardkonform ist.
-
Mir gehts nur darum ob es standardkonform ist.
Ich würde sagen nein. So wie ich das sehe, produzierst du undefiniertes Verhalten.
Denn:Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored.
Der Aufruf der Methode (das Current-> ) führt dazu, dass Current dereferenziert wird. Zwischen dieser Dereferenzierung und der Auswertung der Argumente (und damit der Zuweisung an Current) liegt meines Wissens nach aber *kein*
Sequence-Point.
Damit veränderst du den Wert von Current liest ihn aber auch, aber nicht um den zu speichernden Wert zu bestimmen.Mit der Begründung kann ich auch falsch liegen. Ich denke aber auf jeden Fall, dass das ganze undefiniert ist. Und was ich sicher weiß ist, dass der Aufruf nicht das macht, was man denken könnte.
Naja, vielleicht kann ein C++-Experte das ja noch aufklären.
-
Original erstellt von HumeSikkins:
**Mit der Begründung kann ich auch falsch liegen. Ich denke aber auf jeden Fall, dass das ganze undefiniert ist. Und was ich sicher weiß ist, dass der Aufruf nicht das macht, was man denken könnte.
**Danke, genau das wollte ich wissen!