auto_ptr



  • hi, wie kann ich das folgende Quelltextbsp mit AutoPointern realisieren???
    pseudocode....
    class CTest
    {
    public:
    std::string* Test()const
    {
    std::string *str = new std::string("Huhu");
    return str;
    }

    };



  • using std::auto_ptr;
    using std::string;
    
    auto_ptr<string> foo() {
        auto_ptr<string> tmp(new string(foo));
        return tmp;       // tmp gibt 'ownership' für das interne string-objekt an den aufrufer zurück
    }
    
    int main() {
        auto_ptr<string> ap = foo();
        // ..
    }
    


  • auto_ptr ist doch ne KLasse oder??? Kann ich die denn überhaupt so einfach zurückgeben ohne Referenz bzw. Zeiger?? Danke für die Lösung...

    mfg dohan



  • Dohan schrieb:

    auto_ptr ist doch ne KLasse oder??? Kann ich die denn überhaupt so einfach zurückgeben ohne Referenz bzw. Zeiger?? Danke für die Lösung...

    mfg dohan

    Klar kannst du Klassen per Value über- und zurückgeben.

    MfG SideWinder



  • auto_ptr<string> foo() {
    auto_ptr<string> tmp(new string(foo));
    return tmp; // tmp gibt 'ownership' für das interne string-objekt an den aufrufer zurück
    }

    Ein:

    auto_ptr<string> foo() 
    { 
        return auto_ptr<string>(new string("foo")); 
    }
    

    wäre angebrachter. Und noch besser natürlich. Ein simples:

    string foo() 
    { 
        return string("foo"); 
    }
    

    Es gibt schließlich keinen Grund das string-Objekt auf dem Heap anzulegen.



  • Wo ist denn der Unterschied, außer das alles in einer Zeile steht??



  • Wo ist denn der Unterschied, außer das alles in einer Zeile steht??

    In der Effektivität.

    Prinzipiell hast du hier:
    Konstruktor + Copy-Ctor + Dtor + Copy-Ctor (Ziel) + Dtor.

    Bei der von mir vorgeschlagenen Variante hast du:
    Konstruktor + Copy-Ctor (Ziel) + Dtor.

    Mit return value optimization (RVO - unterstützt nahezu jeder Compiler) wird im Idealfall daraus:
    (Copy-)Konstruktor (Ziel).

    Die erstere Form bräuchte hierzu schon NRVO (machen bei weitem nicht alle Compiler). Häufig wird daraus also nur ein:
    Konstruktor + (Copy)-Ctor (Ziel) + Dtor.



  • gut , wenn ich mir dann eine variable vom typ auto_ptr anlege gilt diese doch eigentlích nur für den namensraum der Methode test oder???? Eigentlich müsste doch nach dem Aufruf die Instanz zerstört werden, wenn ich da dann ne Referenz rauflege bekomme ich doch undefinierte Werte!? Bei welchen Typen wird denn überhaupt die automatische Compileroptimierung verwendet????

    mfg dohan



  • gut , wenn ich mir dann eine variable vom typ auto_ptr anlege gilt diese doch eigentlích nur für den namensraum der Methode test oder???? Eigentlich müsste doch nach dem Aufruf die Instanz zerstört werden

    Der auto_ptr wird auch zerstört. Nur das zuvor vom auto_ptr verwaltete Heap-Objekt nicht, da der auto_ptr in Folge des Copy-Ctor-Aufrufs den Besitz dieses Objekts an den Aufrufer übertragen hat.

    Mir scheint du hast noch genrelle Verständnisprobleme mit den auto_ptr.
    Vielleicht hilft das:
    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=auto_ptr#Answ

    Bei welchen Typen wird denn überhaupt die automatische Compileroptimierung verwendet

    Bei allen udts bei den es nötig und möglich ist (-> die einen einen nicht trivialen Copy-Ctor besitzen, der aufrufbar ist).
    Letztlich ist das aber Compilerabhängig. Der Standard erlaubt diese Form der Optimierung. Schreibt sie aber weder vor, noch definiert er wie genau sie zu implementieren ist bzw. für welche Typen der Compiler sie dann anwenden muss. Ein Compiler könnte sich also durchaus dazu entscheiden die RVO nur Sonntags und nur bei Klassen mit Bezeichnern die Länger als 21 Buchstaben sind durchzuführen.


Anmelden zum Antworten