Verwendung von std::auto_ptr



  • Hallo zusammen,

    ich hab folgendes in einem "Konkurenz"-Forum gelesen:

    auto_ptr needs to be handled with care. Read Meyers very carefully on the subject. Points to note:

    - You cannot use auto_ptrs in an STL container
    - Beware of passing auto_ptrs to functions by value

    Wenn ich ehrlich bin finde ich es sehr sinnvoll std::auto_ptr in STL containern
    zu verwenden. So kann ich doch garantieren, dass alle Objekte in dem container
    freigegeben werden, wenn dieser gelöscht wird.
    Außerdem geben Container doch eine Referenz auf das Objekt zurück. Klar, dass ich
    den std::auto_ptr nicht kopieren darf, da er ja sonst nicht mehr im container ist,
    aber sowas sollte doch wohl selbstverständlich sein.
    Oder was spricht gegen std::auto_ptr in STL containern?

    und warum soll man keine auto_ptr per value übergeben? So kann man doch sehr
    deutlich zeigen, dass die Funktion die Verantwortung für ein Objekt übernimmt...

    Gruß,
    *Cpp-Anfänger*



  • @Container:
    Die Containerklassen können ihre Elemente intern kopieren (gerade vector<> macht das auch regelmäßig) - und da ist das Verhalten des auto_ptr<> etwas ..nunja.. hinderlich.
    (technisch gesprochen: Der Copy-Ctor von auto_ptr<> entspricht nicht den Anforderungen, die an Container-Elemente gestellt werden)

    @Übergabe per value:
    Ja, die aufgerufene Funktion übernimmt die Verantwortung über das Objekt - aber sie gibt sie am Ende nicht wieder zurück:

    void print_value(auto_ptr<my_type> ptr)
    {
      ptr->print();
      ...
    }
    
    auto_ptr<my_type> my_ptr(new my_type);
    ...
    print_value(my_ptr);//Ups, wir haben uns gerade das Objekt zerlegt, mit dem wir arbeiten wollten
    


  • Danke CStoll!!!

    CStoll schrieb:

    (technisch gesprochen: Der Copy-Ctor von auto_ptr<> entspricht nicht den Anforderungen, die an Container-Elemente gestellt werden)

    Klingt logisch...

    CStoll schrieb:

    //Ups, wir haben uns gerade das Objekt zerlegt, mit dem wir arbeiten wollten

    Eigentlich ist das klar, kann man allerdings leicht übersehen 🙂



  • Cpp-Anfänger schrieb:

    Eigentlich ist das klar, kann man allerdings leicht übersehen 🙂

    Alternativen zum auto_ptr gibt es aber: z.B. kann man boost::shared_ptr in Listen verwenden. Zudem gibt es im kommenden Standard (bzw. bei einigen STL Implementierungen im Namensraum std::tr1 ein entsprechendes Konstrukt).

    Nachteil: Boost ist für einen absoluten Anfänger vielleicht schon zuviel des guten und belegt (wenn man alles linkt) auch wahnsinnig viel Platz; wobei die Smartpointer keinen Linklauf erfordern da es reine Headerimplementierungen sind (Falls du MSVC++ benutzt gibt es aber auch eine Installationsversion im Netz die dir zumindest einige Schritte abnimmt).

    cu André



  • asc schrieb:

    Nachteil: Boost ist für einen absoluten Anfänger vielleicht schon zuviel des guten und belegt (wenn man alles linkt) auch wahnsinnig viel Platz;

    Das stimmt nur solange Du Gebrauch von den Binärbibliotheken machst. Die meisten Boost-Bestandteile (so auch die Smartpointer) benötigen ausschließlich Headerfiles. Das heißt: Boost downloaden, entpacken, Include-Pfad in der IDE ergänzen, fertig.



  • Benutze auto_ptr ehrlich gesagt ganz gerne.

    Per value übergebe ich ihn auch gerne. Z.B. bei "Ablauf einbahnstraßen" wie raussenden einer Nachricht. Sozusagen bei shoot and forget Aufrufen.



  • Die Idee leuchtet mir spontan ein ....
    (was nicht automatisch bedeutet, dass sie gut sei ... nur scheint sie es mir gerade)

    Gruß,

    Simon2.


Anmelden zum Antworten