boost::shared_ptr



  • hi

    wie kann boost::shared_ptr::use_count zählen, wieviele zeiger auf sein ziel zeigen und wie kann boost::shared_ptr::unique alle anderen zerstören?



  • dfhdfhgdf schrieb:

    wie kann boost::shared_ptr::use_count zählen, wieviele zeiger auf sein ziel zeigen

    Die Referenzzähler werden irgendwo im Freispeicher angelegt. Wenn Du einen shared_ptr x nach y kopierst, teilen sich x und y sowohl die Referenzzähler als auch den "Objektbesitz". Wird ein shared_ptr zerstört, "meldet er sich ab" beim Referenzzähler. Wenn es der letzte shared_ptr war, löscht er gleichzeitig Referenzzähler und das eigentliche Objekt.

    dfhdfhgdf schrieb:

    und wie kann boost::shared_ptr::unique alle anderen zerstören?

    unique zerstört nichts.



  • hi

    hastu schoma wasvon boost::operatorenüberladung ehört?



  • dfhdfhgdf schrieb:

    wie kann boost::shared_ptr::use_count zählen, wieviele zeiger auf sein ziel zeigen

    tut er nicht, er zählt bloss wie viele shared_ptr auf sein ziel zeigen, die aus dem ersten, ursprünglichen shared_ptr erzeugt wurden.

    wenn du z.b. zwei shared_ptr aus dem selben "rohen" zeiger erstellst, dann kennen sie die gegenseitig nicht, zählen daher falsch, und das objekt wird zu früh gelöscht.
    daher darf man das auch nicht machen.



  • hustbaer schrieb:

    tut er nicht, er zählt bloss wie viele shared_ptr auf sein ziel zeigen, die aus dem ersten, ursprünglichen shared_ptr erzeugt wurden.

    aha, jetzt kapier ichs! danke 👍



  • und was ist der unterschied zwischen auto_ptr und shared_ptr?



  • std::auto_ptr hat ownership transfer und boost::shared_ptr (auch std::tr1::shared_ptr) hat referenz-zählung.



  • std::tr1::shared_ptr<A> aPtr1(new A()); // Zeiger auf A
    std::tr1::shared_ptr<A> aPtr2(aPtr1); // aPtr1 und aPtr2 zeigen auf das selbe A-Objekt
    
    aPtr1 = aPtr2; // beide Zeiger zeigen immer noch auf das selbe A-Objekt
    
    std::auto_ptr<A> aPtr1(new A()); // aPtr1 zeigt auf A-Objekt
    std::auto_ptr<A> aPtr2(aPtr1); // aPtr2 zeigt jetzt auf A-Objekt, aPtr1 ist aber null!
    
    aPtr1 = aPtr2; // aPtr1 zeigt jetzt wieder auf A-Objekt, aPtr2 ist null!
    

    shared_ptr == geteilter Besitz, mehrere Zeiger auf ein Objekt möglich
    auto_ptr == Besitzweitergabe, immer nur ein Zeiger auf Objekt

    Aber bei beiden gilt: Der Letzte macht das Licht aus! 😉


Anmelden zum Antworten