Pointer als Parameter - Problem



  • Hallo,

    ich habe einen Vector (<vector>) der Zeiger auf von mir gebastelte Objekte enthält.

    Also sowas in der Richtung: vector<TestObjekt*> v1;

    Das bedeutet, dass ich beim Hinzufügen eines Objektes einen Zeiger übergeben müsste. Soweit so gut.
    Jetzt habe ich eine Funktion, die mit einer dieser Listen arbeitet:

    void testFunktion(vector<TestObjekt*> v1)
    {
    TestObjekt to1();
    v1.push_back(&to1);
    }
    

    Das funktioniert auch erstmal, allerdings ist der Eintrag aus der Liste verschwunden, wenn ich die Funktion verlasse (so ist mein Programm konzipiert). v1 hingegen ist natürlich weiter zugänglich, da ein Zeiger darauf ja als Parameter übergeben wurde.

    Meine Frage: Wie realisiere ich das beliebig wiederholte Ausführen der testFunktion und ermögliche gleichzeitig auch einen Zugriff auf die TestObjekte von außerhalb?

    Rapthor

    PS: Das Arbeiten mit der Liste v1 geschieht in C-Funktionen, die keine Member-funktionen irgendwelcher Klassen sind. So dass ich auch keine Klassenvariablen von meinen TestObjekten erzeugen kann o.ä..



  • Du musst den Vector per Referenz übergeben und das einzufügende Objekt dynamisch mit new anfordern.

    void testFunktion(vector<TestObjekt*>& v1)
    {
      v1.push_back(new TestObjekt);
    }
    


  • rapthor schrieb:

    void testFunktion(vector<TestObjekt*> v1)
    {
    TestObjekt to1();
    v1.push_back(&to1);
    }
    

    was du da machst, iss eigentlich ne vergewaltigung 😉

    du übergibst das objekt vl als werteparameter, und willst in den vector eine lokale referenz schreiben, die nach der funktion nicht mehr existiert, oder mit anderen daten gefüllt ist...

    aber, nobody is perfect



  • Hab's inzwischen hinbekommen .. Beitrag 2 hat mir da geholfen 🙂

    Danke



  • Vergiss aber bitte nicht das mit new angeforderte Objekt nachher auch mit delete zu löschen, wenn du es nicht mehr brauchst.



  • Ich habe einen Destruktor für das Objekt geschrieben in dem folgendes steht:

    delete this;

    Geht sowas gut? Oder bin ich auf dem Holzweg? Die Zeile wird doch hoffentlich automatisch ausgeführt, sobald ich das Objekt mit v1.erase(x) aus dem Vector lösche, oder?



  • rapthor schrieb:

    Ich habe einen Destruktor für das Objekt geschrieben in dem folgendes steht:

    delete this;

    Geht sowas gut? Oder bin ich auf dem Holzweg? Die Zeile wird doch hoffentlich automatisch ausgeführt, sobald ich das Objekt mit v1.erase(x) aus dem Vector lösche, oder?

    Das geht schief:

    delete ruft erst den Destruktor von this auf und danach gibt es den Speicher frei.
    Da du bereits im Dtor bist, würde ich eine Rekursion erwarten.



  • Da bist du wohl auf dem Holzweg. :p

    Wenn du mit erase() einen Zeiger deines Vektors löscht wird kein Destruktor
    für das zugehörige Objekt aufgerufen.
    Du musst beim Löschen des Vektors für die einzelnen Zeiger jeweils delete
    aufrufen. Dieses delete bewirkt den Aufruf des Destruktors für das Objekt.
    In diesem Sinn ist dein delete this im Destruktor natürlich sinnlos.
    Du solltest dich vielleicht nochmal mit dem Thema mit Hilfe eines Tutorials
    beschäftigen.



  • Was ich jetzt beim Löschen mache, ist folgendes:

    delete v1.at(position);
    v1.erase(v1.begin() + position);
    

    .. mir ist nur noch nicht ganz klar, was genau im Destruktor meines Objektes zu geschehen hat. Die Objekte besitzen jeweils zwei private Variablen und ein paar public Methoden. Nicht weiter wild!?



  • Der delete passt.
    Aber dein delete this macht keinen Sinn (für das was du hier beschrieben hast).



  • Achso, also ist mein Destruktor überflüssig? So, dass ich dessen Implementierung getrost vernachlässigen kann?

    Der wäre ja vielleicht u.a. nötig, wenn ich verkettete Objekte habe, die ich alle rekursiv löschen müsste, wenn sie z.B. mit Pointern verzweigt wären. Aber das ist bei mir ja nicht der Fall.



  • Im Destruktor eines Objektes werden (im Regelfall) nur die innerhalb des Obejektes dynamisch allokierten Objekte freigegeben.
    Wenn Du z.B. innerhalb einer Klasse einen char* hast, dem Du erst zur Laufzeit Speicher mit new zuweist, mußt du diesen im Destruktor der Klasse auch wieder freigeben.



  • Also ein delete this wird beispielsweise verwendet wenn du keinen Destruktor für
    deine Klasse willst und stattdessen eine Cleanup()-Funktion hast. Diese ruft dann
    delete this auf.
    Bei der COM-Programmiereung beispielsweise zählt ein Release() einen Zähler runter
    erst wenn der Zähler die 0 erreicht hat, wird das Objekt mit delete this zerstört.



  • Ahhh alles klar. Ich danke euch 🙂 Ihr konntet mir helfen.


Anmelden zum Antworten