[Boost] Serialization und Smart Pointer



  • 11 schrieb:

    1.) Rohe Zeiger

    iih 👎



  • Gibts keinen Container für auto_ptr/shared_ptr?



  • Turbo Booster schrieb:

    11 schrieb:

    1.) Rohe Zeiger

    iih 👎

    dann hast du wohl den sinn von ptr_vector nicht verstanden



  • Vielen Dank.
    Das hat mir sehr geholfen...



  • Hallo,

    auto_ptr geht nicht in Container rein.



  • Stell ich zu blöde Fragen oder seid ihr alle so wortkarg?

    Also, ich habe eine Funktion, die mir einen Zeiger auf ein innerhalb der Funktion mit new erzeugtes Objekt zurückgibt. (Ist ne Factory Methode) Da dies unschön ist, weil das delete dann dem Aufrufer überlassen ist, wollt ich gern mit nem smarten Pointer arbeiten. (boost oder std) Der zurückgegebene Zeiger soll in einem Container, wahrscheinlich vector, gespeichert werden. Da es sich um polymorphe Objekte handelt, dachte ich an einen ptr_vector, aber offenbar ist dem nicht so.
    Bitte, wie mach ich das nun am besten (s.o. für definition von "am besten")?



  • Warum PROBIERST du nicht einfach mal was aus? Schreib dir ein kleines Programm und teste ob es so klappt wie du es dir vorstellst. Dann kannst du auch konkrete Fragen mit Codebeispielen stellen.

    Das Problem ist, dass du einen boost::shared_ptr nicht einfach in einen ptr_vector hineintuen kannst. Du müsstest die get()-Methode benutzen:

    #include <boost/ptr_container/ptr_vector.hpp>
    #include <boost/shared_ptr.hpp>
    #include <iostream>
    
    struct Widget
    {
        ~Widget()
        {
            std::cout << "Destruktor" << std::endl;
        }
    };
    
    boost::shared_ptr<Widget> CreateWidget()
    {
        return boost::shared_ptr<Widget>(new Widget);
    }
    
    int main()
    {
        boost::ptr_vector<Widget> v;
        v.push_back(CreateWidget().get());
        std::cout << "Test" << std::endl;
    }
    

    Und hierbei wird zweimal der Destruktor von Widget aufgerufen:

    Destruktor
    Test
    Destruktor
    *** glibc detected *** double free or corruption (fasttop): 0x0804c008 ***
    Aborted
    

    Bei einigen Sachen, z.B. Factory ist es nicht so wichtig, dass sie einen Smart Pointer zurück gibt. Nimm den ptr_vector und lass deine Funktion einen rohen Zeiger zurück geben. Und das meine "1 1" glaub ich auch.

    mfg.



  • Wenn du dir die Doku zu den Pointer Containern durchliest, wirst du feststellen, das diese für rohe Pointer entwickelt wurden. Die Std-Container sind ebend nicht für rohe Pointer geeignet, weshalb die Pointer Container entwickelt wurden. Wenn du unbedingt Smartpointer nutzen willst, dann kannst du die Std-Container nutzen. Übrigens, auto_ptr ist total ungeeignet für Container. Das ist eines DER wichtigsten Merkmale dieses Smartpointers, welches man wissen sollte.



  • Danke.

    Hab nun die Docu gelesen, aber eine Frage bleibt mir noch offen.
    Wenn ich den ptr_vector zerstöre, werden dann die Objekte gelöscht?
    Muss ich mich gar nicht mehr um das delete kümmern, auch nicht bei remove()?



  • Ach und die eigentliche Frage, warum ich mir das überhaupt überlege:
    Ist der ptr_vector serializable, oder muss ich die enthaltenden Objekt-Zeiger einzeln rausschreiben?



  • Turbo Booster schrieb:

    Danke.

    Hab nun die Docu gelesen, aber eine Frage bleibt mir noch offen.
    Wenn ich den ptr_vector zerstöre, werden dann die Objekte gelöscht?
    Muss ich mich gar nicht mehr um das delete kümmern, auch nicht bei remove()?

    Erledigt, die Objekte werden zerstört. (Irgendwie logisch)

    Turbo Booster schrieb:

    Ach und die eigentliche Frage, warum ich mir das überhaupt überlege:
    Ist der ptr_vector serializable, oder muss ich die enthaltenden Objekt-Zeiger einzeln rausschreiben?

    Wer gut zu wissen, bevor ich alles einbaue..


Anmelden zum Antworten