Ist hier ein Smart Pointer angebracht?



  • Hallo,

    ich habe eine Art Managerklasse, die Objekte erzeugt. Sie hält selber Zeiger auf die erzeugen Ressourcen, da in gewissen Fällen (Windows Events), die Objekte benachrichtigt werden müssen (davon muss der Benutzer nix mitbekommen)

    Nehmen wir eine Methode als Beispiel. Variante 1 mit Raw Zeigern:

    class Manager {
       map<string, Buffer*> mBuffers;
    
       Buffer* createBuffer(int size, etc);
    };
    
    Anwendung:
    Buffer* buf = manager->createBuffer();
    obj1.buf = buf;
    obj2.buf = buf;
    ...
    

    In createBuffer() wird ein Buffer erzeugt (new Buffer), in mBuffers gespeichert und zurückgegeben.
    Es könnten jetzt 20 AnwenderObjekte auf diesen einen Buffer zeigen.
    Wenn es ein Event gibt, benachrichtigt der Manager alle Buffer. Die Buffer werden im Manager Dtor zerstört.
    Das einzige was mich etwas stört: Selbst wenn kein AnwenderObjekt mehr den Buffer braucht, lebt er weiter (bis Manager zerstört wird).

    2. Ansatz mit Shared Pointer:

    class Manager {
       map<string, shared_ptr<Buffer>> mBuffers;
    
       shared_ptr<Buffer> createBuffer(int size, etc);
    };
    

    Fast wie oben, nur mit Shared Pointer. Jetzt halten alle AnwenderObjekte ebenfalls Shared ptr auf den Buffer. Wenn z.B. 20 Objekte auf einen Buffer zeigen, ist der ref count 21 (weil der Manager auch noch einen Shared ptr hält).
    Nur hab ich da ja das selbe Problem: Auch wenn alle AnwenderObjekte zerstört wurden, lebt der Buffer noch, da der Manager eben noch einen Shared Ptr hält.

    Findet ihr in diesem Fall also Shared Ptr sinnvoll?



  • Du könntest einen weak_ptr auf den Buffer halten. Ein weak_ptr kann immer feststellen, ob das Objekt noch existiert, hält es aber nicht am Leben.



  • Aus welchem Buch kommt eigentlich die Idee, sich eine RessourcenManager-Klasse zu schreiben?



  • volkard schrieb:

    Aus welchem Buch kommt eigentlich die Idee, sich eine RessourcenManager-Klasse zu schreiben?

    Das musste ja kommen. Ich habe doch erklärt, warum ich ihn brauche. Du hast keine Ahnung vom Gesamtdesign, also erspar uns die Metadiskussion.

    @314159265358979: Du meinst die Methoden returnen shared_ptr, aber der Manager hält weak_ptr auf das erzeugte Objekt?



  • Tokkii schrieb:

    @314159265358979: Du meinst die Methoden returnen shared_ptr, aber der Manager hält weak_ptr auf das erzeugte Objekt?

    Genau.



  • Tokkii schrieb:

    Das musste ja kommen. Ich habe doch erklärt, warum ich ihn brauche. Du hast keine Ahnung vom Gesamtdesign, also erspar uns die Metadiskussion.

    Ich will Dir nicht widersprechen, sondern nur wissen, woher der Gedanke kommt.



  • 314159265358979 schrieb:

    Tokkii schrieb:

    @314159265358979: Du meinst die Methoden returnen shared_ptr, aber der Manager hält weak_ptr auf das erzeugte Objekt?

    Genau.

    Hm ja, das klingt eigentlich sehr gut und sollte passen. Schau ich mir gleich mal an. 👍


Anmelden zum Antworten