Problem mit dem new-Operator
-
Es geht um folgende Codezeile in einer main-Funktion:
*test= *new name(*test1);Bei name handelt es sich um eine Klasse und bei test und test1 um zwei weiter oben in der main-Funktion dynamisch angelegte Instanzen.
Leider verstehe ich gar nicht, was das Sternchen vor dem new-Operator zu bedeuten hat. Handelt es sich um eine Dereferenzierung oder um einen neuen Zeiger? Kann mir das jemand erklären?
-
Also der Code sieht für mich sinnlos aus (eventuell wird's klarer, wenn du auch den Bereich darum dazustellst). Die Sterne stehen auf jeden Fall für eine Dereferenzierung, allerdings ist zumindest der vor dem 'new' unsinnig (und erzeugt nur Speicherlecks).
-
Hallo, danke für deine Antwort, ich habe nach Absenden meines Beitrages diesen nochmal editiert und den Code korrigiert. In der Tat war der Code vorher unsinnig, aber jetzt müsste er stimmen.
-
OK, das erklärt die Dereferenzierung von test und test1. Aber wie gesagt, der * vor dem new macht in meinen Augen keinen Sinn.
Inhaltlich: new reserviert Speicherplatz für ein name-Objekt, initialisiert es per Copy-Ctor aus *test1 und gibt seine Adresse zurück. Anschließend dereferenzierst du diesen temporären Zeiger und kopierst den Inhalt des (neu angelegten) Objekts an *test. Am Ende der Zeile vergisst du die Adresse des Objekts wieder -> Speicherleck.
(test und test1 sind Zeiger, also sind *test und *test die Objekte, auf die sie zeigen)Die bessere Möglichkeit wäre:
*test = *test1;//kopiert den Inhalt, ohne ein zusätzliches Heap-Objekt anzulegen und zu vergessen //oder delete test;//Freigabe des bisherigen Speichers test = new name(*test1);//legt ein neues Objekt an und biegt den Zeiger dorthin um
-
Mir fällt grade noch ein, dass ich in der Klasse einen Zuweisungsoperator (operator=(...)) definiert habe. Könnte der in meiner Code-Zeile nicht zum Einsatz kommen?
-
Ja, macht er eigentlich auch - das = dort verwendet op=. (aber das ändert nicht an dem auftretenden Speicherleckt)
PS: Hast du den Code selber geschrieben? Oder von irgendwem kopiert? (in letzterem Fall solltest du diesem Jemand mal erklären, was für einen Müll er verzapft hat ;))
-
Die Adresse das neu allokiierten Objekts geht verloren, du hast ein Speicherleck => nicht gut
-
Lars schrieb:
Die Adresse das neu allokiierten Objekts geht verloren, du hast ein Speicherleck => nicht gut
Schön, daß du alles nochmal wiederholst, was ich sagte - warum kopierst du nicht gleich meine Beiträge komplett
