shared pointer visual studio



  • Hallo,

    ich habe noch nie shared pointer verwendet: ist es korrekt dass ich diese wie normale pointer benutze und davon ausgehen kann dass der heap selbst freigegeben wird? Also muss ich nichts mehr mit delete machen?

    Danke



  • Du meinst std::unique_ptr? Ja, der ist wie ein normaler Pointer mit automatischem delete.



  • babmo schrieb:

    ich habe noch nie shared pointer verwendet: ist es korrekt dass ich diese wie normale pointer benutze

    Nein, nicht genauso. Man sollte z.B. keinen shared_ptr an eine Funktion übergeben, wenn der Pointer nur für den Funktionsaufruf benötigt wird. Dafür gibt es die get-Funktion.

    und davon ausgehen kann dass der heap selbst freigegeben wird? Also muss ich nichts mehr mit delete machen?

    Ja



  • Nein, nicht genauso. Man sollte z.B. keinen shared_ptr an eine Funktion übergeben, wenn der Pointer nur für den Funktionsaufruf benötigt wird. Dafür gibt es die get-Funktion.

    Hä? Ist dem wirklich so, dass man bei einem Funktionsaufruf lieber den Raw-Pointer weitergibt?!?
    Wozu sollte man denn dies tun? Ok ... der Ref-Zähler wird für den Funktionsaufruf einmal hoch gezählt (also hat man da ein wenig Overhead drin), aber dafür habe ich doch genau so einen shared_ptr, damit dies automatisch passiert und ich dann auch in der Funktion weiss, dass ich den Speicher für das übergebene Objekt nicht selbst freigeben muss ... dachte ich bis jetzt.



  • shared_nicht_verstanden? schrieb:

    Hä? Ist dem wirklich so, dass man bei einem Funktionsaufruf lieber den Raw-Pointer weitergibt?!?

    Eigentlich lieber eine Referenz.

    Wozu sollte man denn dies tun? Ok ... der Ref-Zähler wird für den Funktionsaufruf einmal hoch gezählt (also hat man da ein wenig Overhead drin), aber dafür habe ich doch genau so einen shared_ptr, damit dies automatisch passiert und ich dann auch in der Funktion weiss, dass ich den Speicher für das übergebene Objekt nicht selbst freigeben muss ... dachte ich bis jetzt.

    Einer Funktion einen shared_ptr zu übergeben macht nur dann Sinn, wenn dieser den Funktionsaufruf überlebt (also irgendwo gespeichert wird) und der shared_ptr vom Aufrufer noch benötigt wird.

    Ansonsten reicht Übergabe per Referenz oder, je nach Anwendungsfall, unique_ptr.



  • shared_nicht_verstanden? schrieb:

    Hä? Ist dem wirklich so, dass man bei einem Funktionsaufruf lieber den Raw-Pointer weitergibt?!?
    Wozu sollte man denn dies tun? Ok ... der Ref-Zähler wird für den Funktionsaufruf einmal hoch gezählt (also hat man da ein wenig Overhead drin), aber dafür habe ich doch genau so einen shared_ptr, damit dies automatisch passiert und ich dann auch in der Funktion weiss, dass ich den Speicher für das übergebene Objekt nicht selbst freigeben muss ... dachte ich bis jetzt.

    Ja, dem ist wirklich so.
    Das hochzählen des ref-counts muss atomar erfolgen und das kostet halt.

    Es ist gängige/empfohlene Praxis einen Shared Pointer nicht anders als andere Objekte zu betrachten, vom call by value/call by reference Standpunkt.

    Mit anderen Worten call by value Übergabe nur, wenn du wirklich einen neuen Owner hast ansonsten Shared Ptr als reference übergeben oder nackten Ptr.



  • Smartpointer sind kein Ersatz für rohe Zeiger. Smartpointer sind dazu gedacht, mit Ownership umzugehen; ein Smartpointer repräsentiert einen Besitzer eines dynamisch erzeugten Objektes. unique_ptr verwendet man für den üblichen Fall von Objekten mit genau einem Besitzer; shared_ptr ist für den eher seltenen Fall von geteilten Besitzverhältnissen gedacht. Faustregel: Am besten erzeugt man Objekte gar nicht dynamisch, wenn man aber wirklich mal muss, dann nimmt man unique_ptr, sofern man nicht wirklich gute Gründe hat, was Anderes zu tun. Der Besitz und die Verwendung von Objekten sind völlig unabhängige Dinge. Letzteres drückt man mit Referenzen bzw. rohen Zeigern aus.



  • Ok danke euch. Ich würde gerne einen std::vector dynamisch alloziieren über shared ptr damit dieser vector sich selbst wieder freigibt. allerdings scheitere ich am zugriff und bräuchte kleine Hilfe.

    Ich frage mich z.B. wie ich elemente in den vector fülle?

    std::shared_ptr<std::vector<int>> a(new std::vector<int>(4));
    	a.get().insert(a.get().begin(), 8);
    


  • babmo schrieb:

    Ok danke euch. Ich würde gerne einen std::vector dynamisch alloziieren über shared ptr damit dieser vector sich selbst wieder freigibt.

    wieso? was willst du damit erreichen?



  • std::shared_ptr<std::vector<int>> a(new std::vector<int>(4));
    a->insert(a->begin(), 8);
    

    Aber ein vector auf dem heap ist vermutlich dummes Zeug



  • babmo schrieb:

    Ok danke euch. Ich würde gerne einen std::vector dynamisch alloziieren über shared ptr damit dieser vector sich selbst wieder freigibt. allerdings scheitere ich am zugriff und bräuchte kleine Hilfe.

    Ich frage mich z.B. wie ich elemente in den vector fülle?

    Du meinst das hier?

    std::vector<int> a(4);
    a.insert(a.begin(), 8);
    


  • hmm, aber da ist ja dann kein shared pointer drin, also wenn ich einen std::vector als shared pointer alloziiere. oder macht man das nicht sondern immer nur die objekte des vectors?



  • Ein vector ist GENAU das gleiche wie ein Array. Wenn er auf dem Stack allokiert wird, kannst du einen Stackoverflow bekommen.

    shared_ptr ist IMMER der Smartpointer der Wahl, deshalb ist dein Code genau richtig.

    Nur dass man statt

    a->insert(a->begin(), 8);
    

    lieber

    (*a.get()).insert((*a.get).begin(), 8);
    

    schreibt, weil die Dereferenzierung von einem Zeiger schneller ist als von einem Smartpointer.

    Üblich ist da ein Makro:

    #define a (((****(((a))).get()))))))
    a.insert(a.begin(), 8);
    


  • tatsache schrieb:

    Ein vector ist GENAU das gleiche wie ein Array. Wenn er auf dem Stack allokiert wird, kannst du einen Stackoverflow bekommen.

    Schwachsinn



  • babmo schrieb:

    hmm, aber da ist ja dann kein shared pointer drin, also wenn ich einen std::vector als shared pointer alloziiere. oder macht man das nicht sondern immer nur die objekte des vectors?

    Warum willst du eine shared pointer verwenden?



  • tatsache schrieb:

    Ein vector ist GENAU das gleiche wie ein Array. Wenn er auf dem Stack allokiert wird, kannst du einen Stackoverflow bekommen.

    shared_ptr ist IMMER der Smartpointer der Wahl, deshalb ist dein Code genau richtig.

    Nur dass man statt

    a->insert(a->begin(), 8);
    

    lieber

    (*a.get()).insert((*a.get).begin(), 8);
    

    schreibt, weil die Dereferenzierung von einem Zeiger schneller ist als von einem Smartpointer.

    Üblich ist da ein Makro:

    #define a (((****(((a))).get()))))))
    a.insert(a.begin(), 8);
    

    Dasen Trollpost?! hu



  • tatsache schrieb:

    Ein vector ist GENAU das gleiche wie ein Array. Wenn er auf dem Stack allokiert wird, kannst du einen Stackoverflow bekommen.

    Der "Content" eines vectors liegt auf dem Heap, da kann es zu keinem Stackoverflow kommen.

    Das einzige was auf dem Stack liegt ist der Pointer und vielleicht noch ein paar Variablen zur Administration.



  • @Skym0sh0
    Ja.
    Obvious Troll is obvious.


Anmelden zum Antworten