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 ObjektAber bei beiden gilt: Der Letzte macht das Licht aus!