Weak(_ptr) Cache



  • Hallo,

    ich habe vor kurzem in einem Talk von Herb Sutter in einem Beispiel eine kleine Cache-Klasse gesehen, welche die Daten inter als weak_ptr speichert und ggf. läd, falls nicht gecached und als shared_ptr zurückgibt. Ich würde sowas gerne nutzen und Frage mich nun (da ich den Talk und auch die Stelle nichtmehr genau weiß), auf was ich da genau achten muss. Klar ist, dass das Object zerstört wird, sobald alle shared_ptr zerstört sind. Der weak_ptr liegt aber immernoch im Cache. Wie gehe ich da am besten vor, sodass ein weak_ptr der auf nichts mehr zeigt erkannt und zerstört wird, ohne dass dieser vorher unheil anrichtet?



  • https://isocpp.org/wiki/faq/wg21#herb-sutter:

    shared_ptr<widget> get_widget( int id ) {
        static map<int, weak_ptr<widget>> cache;
        static mutex mut_cache;
        lock_guard<mutex> hold( mut_cache );
        auto sp = cache[id].lock();
        if( !sp ) cache[id] = sp = load_widget( id );
        return sp;
    }
    


  • Oh verdammt 😃
    Hatte nach "Cache" und "weak_ptr" gesucht, hätte vieleicht auch mal "Herb Sutter" mit suchen können, danke 🙂



  • Meine Suchbegriffe waren "sutter ten liner".


Anmelden zum Antworten