Frage zu std::vector und boost::weak_ptr



  • Einen Guten Abend euch allen!

    Ich hab da mal eine Frage zum boost::weak_ptr mit dem ich grade etwas "rumspiele" und mir ein gewisses Verhalten nicht erklären kann.

    Folgenden Code benutze ich zum testen:

    #include <iostream>
    #include <string>
    #include <vector>
    #include <boost/weak_ptr.hpp>
    
    struct texture
    {
        texture () {std::cout << __FUNCTION__ <<std::endl;}
        ~texture () {std::cout << __FUNCTION__ <<std::endl;}
        std::string value;
    
    };
    typedef boost::shared_ptr<texture> texture_ptr;
    
    struct manager
    {
        manager () {std::cout << __FUNCTION__ <<std::endl;}
        ~manager () {std::cout << __FUNCTION__ <<std::endl;}
    
        texture_ptr load (const std::string& value)
        {
            for (int i = 0; i < vec_.size (); ++i)
            {
                texture_ptr temp = vec_[i].lock ();
                if (temp->value == value)
                    return temp;
            }
    
            texture_ptr result (new texture);
            result->value = value;
            return result;
        }
    
        typedef std::vector<boost::weak_ptr<texture>> vector_ptr;
        vector_ptr vec_;
    };
    
    int main ()
    {
        manager man;
    
        // Ein Scope und Textur-Objekt erstellen mit "hallo"
        // und einfach nur auf das Attribut "value" zugreifen.
        {
            texture_ptr tex = man.load ("hallo");
            std::string temp = tex->value;
        }
    
        // Erstelltes Textur-Objekt "hallo" anfordern
        // und einfach nur auf das Attribut "value" zugreifen.
        texture_ptr tex = man.load ("hallo");
        std::string temp = tex->value;
    }
    

    Also ich habe bei diesem Code ein Phänomen was ich mir in keinster Weise erklären kann. Ich erstelle ein Textur-Objekt in einem Scope mit dem Inhalt "hallo" und greife mal just 4 fun drauf zu. In der Klasse "manager" ist nun dieses Objekt einmal im vektor enthalten (so wie es auch sein soll) und beim verlassen des Scopes kommt es zu etwas Merkwürdigem:

    Das Textur-Element wird gelöscht und dessen Destruktor aufgerufen und aus dem Vektor entfernt, obwohl ich nirgendwo ein vec_.erase auf dieses Element durchgeführt habe, mit meinen "Löschvorgaben".

    Jetzt meine Frage: Wie kann das sein, das "vector" realisiert "Hey, der Zeiger in weak_ptr wird nicht mehr benutzt, also raus damit aus der Liste!"

    Nicht das es micht stören würde (so wollte ich es ja auch irgendwie), aber ich kanns mir nicht erklären.

    Ich hoffe ihr könnt mir diesen Effekt erklären.

    Achja, die Ausgabe des Programms ist:

    manager::manager
    texture::texture
    texture::~texture
    texture::texture
    texture::~texture
    manager::~manager
    

    Einen schönen Abend / Nacht euch noch.

    - C++'ler



  • C++'ler schrieb:

    Ich hab da mal eine Frage zum boost::weak_ptr mit dem ich grade etwas "rumspiele" und mir ein gewisses Verhalten nicht erklären kann.

    Dir ist bewusst, das der weak_ptr nur zusammen mit dem shared_ptr überhaupt sinn macht? (weak_ptr kann sich an einen shared_ptr "anhängen", im Gegensatz zu den shared_ptr-Instanzen macht er keine Referenzzählung, und ich ungültig (was abprüfbar ist) wenn kein shared_ptr mehr die entsprechende Referenz hält.

    cu André



  • Hast du dir den Quelltext überhaupt angesehen? Ich benutze doch shared_ptr?!

    Meine Frage ist: "Wie realisiert vector, dass das Element nicht mehr benötigt wird und es aus der Liste wirft?"

    Denn dieses Verhalten habe ich gerade und kann es mir nicht erklären und dein Post hat mir irgendwie keinerlei Klarheit gegeben, sondern noch mehr Fragen aufgeworfen. Sorry, bin halt noch nicht so ein Guru wie du 😉



  • Aaah sorry, ich bin blöde! Ich habe total vergessen ein vec_.push_back (result); bei load einzubauen. Ohje, das ist mir mega peinlich. 🙄

    Dennoch danke für die Hilfe. 😃



  • C++'ler schrieb:

    Hast du dir den Quelltext überhaupt angesehen? Ich benutze doch shared_ptr?!

    Okay, jetzt beim zweiten mal nachsuchen sehe ich den auch (im typedef versteckt und das include fehlt auch).

    C++'ler schrieb:

    Meine Frage ist: "Wie realisiert vector, dass das Element nicht mehr benötigt wird und es aus der Liste wirft?"

    Der Vector realisiert das garnicht. Im vector werden die weak_ptr auch bis zum Schluß drinne stehen wenn du sie niemals entfernst. Das sie nicht mehr auf etwas zeigen wenn der zugehörige shared_ptr leer ist, ist etwas anderes.

    cu André



  • mammamia;



  • mammamia;


Anmelden zum Antworten