Speicherfreigabe bei Design von Model



  • Hallo zusammen,

    ich habe ein Model, das bestimmte Objekte und deren Farben zurückliefert.
    Die einzelnen Objekte sind von dem Model erzeugt worden und sollen auch
    später durch jenes gelöscht werden (RAII).
    Jetzt möchte ich aber Objekte in der GUI in dem Model selektieren können.
    Dazu habe ich mir gedacht, dass ich ein weiteres Model implementiere,
    das einfach ein derartiges Model kapselt und falls es selektiert ist, ein neues
    Objekt erzeugt, das alle Daten des originalen kapselt, aber die Farben manipuliert.
    Nur dann wird ja genau diese Objekt nicht mehr freigegeben 😞
    Wie würdet ihr dieses Problem lösen? Also das Design in shared_ptr zu ändern finde ich blöd. Einen Selektion-Listener, den mein neues Model implementiert,
    der bei Deselektion diese Objekte wieder freigibt finde ich schon besser.

    Wie würdet ihr das machen? Welche VErsion würdet ihr bevorzugen?
    Evtl. andere Vorschläge?

    Gruß,
    *Cpp-Anfänger*



  • Wieso konstruierst du dir nicht einfach einen View auf das Model, so das der View dann die Objekte darstellt.
    Natürlich darf das Model die Objekte nicht freigeben, die im View sind.

    Evtl. könntest du mal etwas Code zeigen, um dein Problem klarer darzustellen.



  • hi phlox81,

    danke für die Idee, ich werde mir meine Gedanke dazu machen.

    Code kann ich leider erst heute abend posten.

    Gruß,
    *Cpp-Anfänger*



  • phlox81 schrieb:

    Wieso konstruierst du dir nicht einfach einen View auf das Model, so das der View dann die Objekte darstellt.
    Natürlich darf das Model die Objekte nicht freigeben, die im View sind.

    Dies sind die Momente wo ich Smartpointer empfehlen kann.

    Wenn man im Model die Elemente, die nach außen weitergegeben werden über einen Smartpointer mit Referenzzählung (z.B. boost::shared_prt, std::tr1::shared_ptr) verwaltet und diese Elemente auch so weitergibt, ist sichergestellt das die Freigabe erfolgt wenn keiner mehr darauf zugreift.

    cu André



  • asc schrieb:

    phlox81 schrieb:

    Wieso konstruierst du dir nicht einfach einen View auf das Model, so das der View dann die Objekte darstellt.
    Natürlich darf das Model die Objekte nicht freigeben, die im View sind.

    Dies sind die Momente wo ich Smartpointer empfehlen kann.

    Wenn man im Model die Elemente, die nach außen weitergegeben werden über einen Smartpointer mit Referenzzählung (z.B. boost::shared_prt, std::tr1::shared_ptr) verwaltet und diese Elemente auch so weitergibt, ist sichergestellt das die Freigabe erfolgt wenn keiner mehr darauf zugreift.

    cu André

    Sehe ich ähnlich, nur müsste man dann auch im Model komplett auf Smartpointer setzen. Eine Liste an Objekten im Model könnte aber genauso gut z.b. ein boost::ptr_vector sein.
    Evtl. ist es auch praktikabel den View nur als Observer umzusetzen, falls es eine reine Darstellung ist.

    phlox


Anmelden zum Antworten