Frage zu std::List<>



  • (*it)->ignition()
    

    edit: zu spät.



  • Ethon schrieb:

    Hat es einen Grund dass du auf tg operierst obwohl dein Iterator it heißt? Du inkrementierst auch den falschen.

    Ansonsten hast du sozusagen einen Doppelzeiger hier. Machs so:

    (*it)->ignition();
    

    Vielen Dank !



  • Das würde dann auch bedeuten das wenn ich mittels delete Speicher freigeben möchte sollte ich beim Iterieren mit Iterator it so vorgehen:
    ...

    delete (&it);
    

    ...

    Richtig?



  • Ne, in diesem Fall holst du dir die Addresse des Iterators!

    delete &(*it);
    

    Uerst das Objekt holen und dann per Addressoperator die Addresse des Objektes nehmen.

    Wäre halbrichtig. Wieso halbrichtig? Weil du kein delete verwenden solltest.
    Gibt es einen Grund wieso du die Objekte per new anlegst? Wenn es denn gibt, mann mach lieber eine std::list<std::unique_ptr<MyObject>>.



  • Ethon schrieb:

    Uerst das Objekt holen und dann per Addressoperator die Addresse des Objektes nehmen.

    Nur sind die Objekte wiederum Zeiger. Also ist das & zuviel.



  • Michael E. schrieb:

    Ethon schrieb:

    Uerst das Objekt holen und dann per Addressoperator die Addresse des Objektes nehmen.

    Nur sind die Objekte wiederum Zeiger. Also ist das & zuviel.

    Öhhhh ... stimmt. 😉



  • Ethon schrieb:

    Ne, in diesem Fall holst du dir die Addresse des Iterators!

    delete &(*it);
    

    Uerst das Objekt holen und dann per Addressoperator die Addresse des Objektes nehmen.

    Wäre halbrichtig. Wieso halbrichtig? Weil du kein delete verwenden solltest.
    Gibt es einen Grund wieso du die Objekte per new anlegst? Wenn es denn gibt, mann mach lieber eine std::list<std::unique_ptr<MyObject>>.

    Danke für die Hilfe, hat funtioniert.

    Ich muss die Objecte mittels new anlegen weil ich sie auch außerhalb des definierten Bereichs brauche.
    Diese Objecte sollen gewisse Zustände speichern und an anderer Stelle verglichen werden.
    Die statischen Objecte ohne new erzeugt werden nach verlassen des scopes zerstört obwohl ich sie noch brauche...



  • DirkS schrieb:

    Die statischen Objecte ohne new erzeugt werden nach verlassen des scopes zerstört obwohl ich sie noch brauche...

    Nimm wie gezeigt std::unique_ptr , der räumt automatisch auf. Oder Boost.PtrContainer...



  • DirkS schrieb:

    Ethon schrieb:

    Ne, in diesem Fall holst du dir die Addresse des Iterators!

    delete &(*it);
    

    Uerst das Objekt holen und dann per Addressoperator die Addresse des Objektes nehmen.

    Wäre halbrichtig. Wieso halbrichtig? Weil du kein delete verwenden solltest.
    Gibt es einen Grund wieso du die Objekte per new anlegst? Wenn es denn gibt, mann mach lieber eine std::list<std::unique_ptr<MyObject>>.

    Danke für die Hilfe, hat funtioniert.

    Ich muss die Objecte mittels new anlegen weil ich sie auch außerhalb des definierten Bereichs brauche.
    Diese Objecte sollen gewisse Zustände speichern und an anderer Stelle verglichen werden.
    Die statischen Objecte ohne new erzeugt werden nach verlassen des scopes zerstört obwohl ich sie noch brauche...

    Die Objekte in der Liste doch nicht?
    Oder sollen die Objekte länger leben als die Liste? Dann wäre das ein Fall für std::shared_ptr.



  • DirkS schrieb:

    Ich muss die Objecte mittels new anlegen weil ich sie auch außerhalb des definierten Bereichs brauche.
    Diese Objecte sollen gewisse Zustände speichern und an anderer Stelle verglichen werden.
    Die statischen Objecte ohne new erzeugt werden nach verlassen des scopes zerstört obwohl ich sie noch brauche...

    Ist dir bewusst, dass in der Liste Kopien der Objekte gespeichert werden, die so lange wie die Liste leben? Wenn ja: Kannst du die Lebenszeit der Liste verlängern?

    Und noch die für std::list typische Frage: Hast du die Performance mal mit std::vector verglichen? Der vector zieht die list häufig ab, obwohl einem tolle Containerentscheidungsbildchen was anderes erzählen wollen.


Anmelden zum Antworten