Boost shared_ptr - Speichermanagement



  • Hallo, ich verwende in einem Programm den Boost-Smartpointer shared_ptr.

    Nach dem was ich bis jetzt gelesen habe verhält sich das mit dem Speichermanagement folgendermaßen:

    Das referenzierte Objekt wird gelöscht, wenn (der letzte) shared_ptr auf dieses Objekt seine Gültigkeit verliert.

    Also kann man zum Beispiel das referenzierte Objekt mit der reset() Methode löschen. Seh ich das bis jetzt richtig?

    Wird das referenzierte Objekt auch gelöscht wenn die shared_ptr Variable (zum Beispiel am Ende einer Funktion) ihre Gültigkeit verliert? Oder gibt das ein Memory Leak.

    Oder zum Beispiel wenn man shared_ptr in einem std::vector speichert und diesen mit clear() leert. Wird da alles durch den shared_ptr gelöscht oder muss ich da Hand anlegen?

    Hoffe ihr könnt mir helfen 😕 😞



  • Der shared_ptr macht das alles selbst. Es gibt ihn mittlerweile auch im Standard (std::shared_ptr<>). Mit reset kannst du noch ein bisschen eingreifen, aber falsch machen kannst du was Leaks angeht, fast nichts.

    Was zu Problemen führen kann ist, wenn 2 shared_ptr sich gegenseitig referenzieren:

    class A
    {
    	std::shared_ptr<B> b;
    };
    
    class B
    {
    	std::shared_ptr<A> a;
    };
    

    Dann kann es passieren, dass sie sich gegenseitig "hochschaukeln" (also hochzählen) und obwohl es beide Instanzen nicht mehr geben sollte, sie sich gegenseitig am Leben halten. Um solche Zyklen aufzubrechen gibt es dann std::weak_ptr.

    In den Artikeln hier im Forum gibt es einen schönen Bericht darüber.

    Merke: shared_ptr verwaltet seine Ressourcen ganz alleine und ist dabei exceptionsicher. Der Vorteilg egenüber zum auto_ptr oder zum unique_ptr ist, dass er kopierbar ist und damit die Ressource für alle seine Kopien gleich verwaltet.



  • Okay. Dann kann man ja nicht viel falsch. Macht also nix, wenn shared_ptr auf etwas verweist und dann shared_ptr die Gültigkeit verliert.

    Vielen Dank für die anschauliche Beschreibung.
    Hast mir sehr geholfen!



  • Kein Problem.

    Denn genau dafür ist ja auch der shared_ptr da, bzw alle Smart-Pointer.
    Wobei man defaultmässig erstmal unique_ptr nehmen sollte und erst bei Bedarf auf shared_ptr umschwenken sollte.


Anmelden zum Antworten