Announcement

Collapse
No announcement yet.

Loeschen einer Referenz

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Loeschen einer Referenz

    Hallo zusammen<br>
    Ich habe ein Problem beim Loeschen einer Referenz<br>
    wenn ich eine Funktion einer anderen Klasse aufrufe<br>
    //Klasse X<br>

    TStringList * ret()<br>
    return lst;<br>
    Nun erfolgt der Aufruf, von einer anderen Klasse<br>
    Zuerst wurde die Klasse instanziert, sowie ein neue Instanz<br>
    von TStingList erzeugt<br>

    lst = ret()
    {<br>
    TStringList * lst = new TStringList();<br>
    delete lst;lst = NULL <br>
    Beim deleten, wird eine Exception geworfen, setzt ich hingegen<br>
    den Pointer nur auf NULL, ist alles OK<br>
    Heisst dass, das ich die Referenz nicht loeschen muss?<br>

    Gruss und Danke für die Hilfe<br>
    Sarah

  • #2
    Hallo Sarah,

    wenn ich das richtig gesehen habe, deletest Du zuerst das Objekt, und willst es dann auf null setzen. Das mit dem Null-Setzen kommt aber eher von Java. Bei der TStringList würde ich es folgendermaßen machen:

    Ist->Clear();
    <b>delete</b> Ist

    Comment


    • #3
      Hi,

      Es spricht doch nichts dagegen einen Zeiger nach dem löschen auf NULL zu setzen, ich mach das eigentlich immer so (vor allem bei Zeiger die global oder Klassenweit bekannt sind) um nachzuvollziehen , ob ein Zeiger auch wirklich gelöscht ist.<br>
      Ich denke der lst ist schon nicht mehr existent und es wird versucht eine schon gelöschten Zeiger nochmal zu löschen. Aber aus dem angegebenen Codefragment werden ich leider nicht schlau.

      Gruß Thorste

      Comment


      • #4
        Hallo Thorsten <br>
        Ich versuche mein Problem besser zu erklären<br>
        Ich habe 2 Klassen, in einer Klasse gibt es eine Funktion<br>
        die so aussieht:<br>

        TStringList * ret()<br>
        {return lst;}<br>

        In der anderen Klasse instanziere ich diese Klasse<br>
        und erzeuge ein neues TStringList-Objekt, diesem Objekt weise ich<br>
        den return-value der Funktion der anderen Klasse zu.<br>

        TStringList list = new TStringList();<br>
        list = ret();<br>
        wenn ich jetzt list delete gibt es einen Fehler! Ich weiss warum<br>
        die Funktion ret gibt einen Pointer retour TStringList * ret()<br>
        es muss aber trotzdem möglich sein list zu deleten, auch wenn ich <br>
        ihr eine Referenz zugewisen habe<br>
        Hoffentlich war meine Ausführung ein wenig verständlicher<br>
        Gruss Sara

        Comment


        • #5
          Liefert denn ret() auch einen gültigen Zeiger zurück?<br>
          Ich würde Deinen Code eher so verstehen:<br>
          <pre>
          TStringList *ret()
          {
          TStringList *lst = new TStringList();
          return lst;
          }

          void Func()
          {
          TStringList *List;

          List = ret();
          delete List; List =NULL;
          }
          </pre>

          Bei so einem Aufbau funktioniert das Löschen.<br>
          Bei Deinem Konstrukt erzeugst Du List und weist dem gültigen Zeiger irgendeine neue Speicherstelle zu. Auf jedem Fall solltest Du Dir vor dem Löschen sicher sein, dass List auf eine gültige Speicherstelle zeigt.

          Vielleicht ist aber auch Deine Überlegung nicht ganz richtig. Du gibst mit der Fkt ret() einen Zeiger auf TStringList zurück. Dieser Zeiger muss aber in der Klasse auch auf eine gültige Speicherstelle zeigen.

          Gruß Thorste

          Comment


          • #6
            Hallo Thorsten<br>
            Ich habe die Funktion so wie Du geschrieben, ausser, dass das<br>
            List-Objekt in ret nicht leer ist!. Ich kann auch mit dem neu<br>
            zugewiesenen Objekt arbeiten; nur deleten geht nicht!<br>
            Danke vilmals für deine Hilfe!<br>
            Wenn ich die Loesung habe,werde ich sie veroeffentlichen<br>
            Danke Sara

            Comment

            Working...
            X