Komplexe Objekte in Liste einfügen



  • Hi,
    ich arbeite seit heute als Werkstudent bei einer Firma. Ich soll ein Projekt weitermachen, das, zum Glück, nur intern verwendet wird und wahrscheinlich auch nur temporär. Es wurde von einem Praktikanten begonnen.
    Ich bin selbst C++ Anfänger, aber folgender Code ist doch zwei mal komplett falsch:

    while(bla) {  
      MyComplexObject *o = new MyComplexObject();
    
      list.add(*o); // Wert wird eingefügt.
      // delete fehlt
    }
    

    Old-School-mäßig würde ich das so machen:

    while(bla) {  
      MyComplexObject *o = new MyComplexObject();
    
      list.add(o); // Adresse wird eingefügt.
    }
    

    Und dann später bei der Verarbeitung:

    for (std::list<MyComplexObject>::iterator it = myList.begin(); it != myList.end(); it++) {
      MyComplexObject *o = *it;
      // Verarbeiten
      delete o;
    }
    

    Anmerkung: Es wird VS 2005 und Qt 4.7 benutzt.

    Ist mein Ansatz einigermaßen korrekt?

    L. G.,
    IBV



  • Du fügst den Pointer als int in eine Liste ein? Son Quatsch.

    Warum überhaupt new? std::list<MyComplexObjext> und gut is!



  • Nein, dein Ansatz ist nicht korrekt.
    In korrektem Ansatz verwendet man kein new und delete manuell.
    Wenn du dein Projekt nach C++11 portieren kannst, nimm eine Liste* von unique_ptr<MyComplexObject>, wenn dynamische Allozierung zwingend notwendig ist.
    Ansonsten so etwas wie boost's pointer container.

    *Wieso eigentlich Liste? IdR ist auch das falsch, nimm std::vector.



  • @manni66: Copy & Paste, thx. 😉 Aber std::list<MyComplexObjext> ist auch falsch. Du kopierst und das ist immer teurer als einen Zeiger zu übergeben.

    @Nathan: Wie gesagt: VS 2005. new und delete ist nicht falsch, aber halt nicht modern. Dynamische Alloziierung ist m. A. n. notwendig, weil die Objekte ja in einer Liste eingefügt werden und es teurer wäre, wenn ich ganze Objekte dort einfüge.
    Boost könnte ich evtl. verwenden.

    L. G.,
    IBV



  • Was ist denn list für ein Typ? Und was macht add() ?



  • Furble Wurble schrieb:

    Was ist denn list für ein Typ? Und was macht add() ?

    Das ist Pseudocode!



  • IBV schrieb:

    Dynamische Alloziierung ist m. A. n. notwendig, weil die Objekte ja in einer Liste eingefügt werden und es teurer wäre, wenn ich ganze Objekte dort einfüge.

    Wieso sollte es teurer sein, da ganze Objekte reinzufügen? So haste zwei news, einen für den Node und einen für das Objekt. Besser ist das definitiv nicht.
    Und nochmal: Wieso überhaupt Liste?


  • Mod

    IBV schrieb:

    @manni66: Copy & Paste, thx. 😉 Aber std::list<MyComplexObjext> ist auch falsch. Du kopierst und das ist immer teurer als einen Zeiger zu übergeben.

    Move-Operationen anbieten? Emplace benutzen?

    Der genannte Vorteil von Pointern ist ein laengst vergangener Mythos aus der Steinzeit fruehen Postmoderne.



  • Nathan schrieb:

    Wieso sollte es teurer sein, da ganze Objekte reinzufügen?

    Weil ein Kopieren einer Adresse schneller ist als, sagen wir, 100 Byte Objekte? Hätte ich nun gedacht...

    Und nochmal: Wieso überhaupt Liste?

    Ich weiß nicht, weshalb er Liste genommen hat. vector ist wohl tatsächlich besser.

    L. G.,
    IBV



  • IBV schrieb:

    Nathan schrieb:

    Wieso sollte es teurer sein, da ganze Objekte reinzufügen?

    Weil ein Kopieren einer Adresse schneller ist als, sagen wir, 100 Byte Objekte? Hätte ich nun gedacht...

    Ich glaub das zweite new ist da immer noch schlimmer, aber das ist für meinen Geschmack jetzt zu sehr premature optimization.


Log in to reply