weak_ptr + shared_ptr design



  • Hallo

    seit neustem habe ich in meiner anwendung alle raw-pointer durch
    smart_pointer ersetzt. und da stellt sich mir die frage, ob man das eine
    oder andere besser/schöner schreiben kann.

    die datenstruktur die ich verwalten will, besteht aus mehreren knoten,
    welche beliebig untereinander verknüpft sind. zwischen jedem knotenpaar
    existiert ein "link"-objekt, dass die verbindung näher beschreibt.

    jeder knoten hat einen std::vector<weak_ptr<Link> > um auf seine verbindungen
    zugreifen zu können, jeder Link hingegen hat 2 weak_ptr<Node>, kennt also
    seine beiden enden.

    die "masterklasse" verwaltet diese struktur mittels shared_ptr's auf die Knoten
    und Links.

    das führt jedoch zu sehr vielen "unregister" funktionen, denn wenn z.b. ein
    knoten entfernt wird, muss dieser seine links zerstören, diese wiederrum
    melden sich bei den anderen knoten ab. (ein link braucht immer 2 knoten zum
    existieren)

    es funktioniert zwar, aber ich glaube nicht, dass das wirklich das wahre vom
    ei ist. ich suche jetzt also ein paar tipps wie ich das "besser" machen kann.

    (und NEIN ich schreibe keinen routenplaner).

    MfG boost_ptr



  • Alle Zeiger durch Smart-Pointer zu ersetzen kommt mir zu kategorisch vor. Wenn du passive, nicht besitzende Zeiger hast, deren Ziel keine spezielle Lebensdauer oder Kopiersemantik (à la shared_ptr ) besitzt, kannst du ruhig normale Zeiger nehmen.

    Smart-Pointer empfehlen sich vor allem in Anwendungsbereichen, die sonst manuelle Speicherverwaltung und zusätzlichen Code (z.B. für Fehlerbehandlung mit Exceptions) erfordern, aber lange nicht überall. Nicht zuletzt sollte man den Overhead bedenken, der oftmals gar nicht nötig ist. Sehr viele Programmierer machen zum Beispiel den Fehler, shared_ptr in Container zu stopfen, obwohl Pointer-Container (wie die von Boost) viel klüger wären.



  • boost_ptr schrieb:

    seit neustem habe ich in meiner anwendung alle raw-pointer durch smart_pointer ersetzt. und da stellt sich mir die frage, ob man das eine oder andere besser/schöner schreiben kann.

    Auch wenn ich ein Fan von Smartpointern bin, würde ich wie Nexus davon abraten den shared_ptr auf biegen und brechen zu verwenden. shared_ptr ist der "teuerste" aller Smartpointer, bevor man diesen einsetzt sollte man zumindest schauen ob nicht "billigere" Varianten in den Fall ausreichen (Ggf. sogar normale Zeiger in Kombination mit den Boost Zeigercontainern).

    Gerade in deinem Fall hört es sich so an, als würde letzteres ausreichen, sofern wirklich eine Klasse die Verwaltung übernimmt.


Anmelden zum Antworten