Was sind starke Hinweise und schwache Hinweise

Lesezeit: 6 Minuten

Benutzer-Avatar
max

Ich bin verwirrt mit dem Begriff “starker Zeiger” und “schwacher Zeiger”. Diane Hackborn selbst sagte dazu:

Das Objekt bleibt in der Nähe, solange es starke Zeiger gibt; es wird zerstört, sobald das letzte freigegeben wird. Alles, was Sie mit einem schwachen Zeiger tun können, ist zu vergleichen und zu versuchen, ihn zu einem starken Zeiger zu machen; Letzteres schlägt fehl, wenn es keine anderen starken Zeiger auf dem Objekt gibt.

Was mir ziemlich unklar ist. Ist ein starker Zeiger ein Äquivalent von a (boost::)gemeinsamer Zeiger? Und was ist die Rolle eines schwachen Zeigers, wenn er nur versucht, sich selbst zu einem starken Zeiger zu machen? Wann brauchen wir zum Beispiel schwache und starke Hinweise?

Aktualisieren:

Vielen Dank an alle, aber ich frage speziell nach dem Android-Kernel sp und wpund sie haben überhaupt nichts mit den Referenzen von Java zu tun.

Im Grunde versuche ich hier den Code zu knacken http://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.html
Und verstehe die Verwendung von nicht wirklich sp und wp

Aktualisieren:

Die eigentliche Antwort liegt in den Kommentaren der akzeptierten Antwort. Danke an Gabe Sechan:

Starke und schwache Zeiger sind unterschiedliche Smart-Pointer-Implementierungen und tun ungefähr dasselbe – wenn ein Zeiger den Gültigkeitsbereich verlässt, wird er nicht freigegeben, solange mindestens ein starker Zeiger darauf verweist. Wenn nur schwache Zeiger (oder nichts) referenziert werden, wird es sein. Die Überprüfung erfolgt immer dann, wenn ein starker oder schwacher Verweis darauf entschlüsselt wird.

Wenn ich 10 schwache Zeiger habe, die auf dasselbe Objekt verweisen, und einer dieser 10 den Gültigkeitsbereich verlässt, wird das Objekt zerstört? Während bei starken Zeigern das Objekt nur dann zerstört wird, wenn alle 10 den Gültigkeitsbereich verlassen?

Ja fast. Wenn Sie nur 10 schwache Zeiger haben, wäre es wahrscheinlich bereits aus dem Geltungsbereich verschwunden, als der letzte starke Zeiger aus dem Geltungsbereich ging. Die Implementierung kann es ermöglichen, dass es eine Weile länger bleibt, wenn es freien Speicher gibt, aber es wird gehackt, wenn Sie in einen Zustand mit wenig Speicher geraten, und es klingt nicht so, als wäre ihre Implementierung so weit fortgeschritten wie ihr Zitat. Und die Verwendung davon ist immer noch hauptsächlich Caching – es entspricht in etwa einem Boost von shared_ptr und einem Boost von schwachem_ptr. Im Grunde genommen kann ein schwacher Zeiger das Objekt, auf das er verweist, jederzeit verschwinden lassen.

  • +1 für den Versuch, dieses Konzept zu erklären

    – Müller

    2. Juli 2014 um 12:50 Uhr

sp bedeutet StrongPointer in Android, der vom angezeigten Objekt belegte Speicher wird freigegeben, wenn der Referenzzähler gleich 0 ist. wp bedeutet WeakPointer. Wenn ich also einen schwachen Zeiger habe, ist es mir egal, ob das referenzierte Objekt lebt oder nicht . Es kann in einigen Cache- und Vergleichsszenarien verwendet werden.

Werfen Sie zunächst einen kurzen Blick auf die sp-Implementierung in StrongPointer.h.

Es ist einfach ein Wrapper für die Referenzzählung. Zum Beispiel,

template<typename T> template<typename U>
sp<T>& sp<T>::operator = (U* other)
{
    if (other) ((T*)other)->incStrong(this);
    if (m_ptr) m_ptr->decStrong(this);
    m_ptr = other;
    return *this;
}

Wenn Sie einen Strong Pointer erstellen, indem Sie sp<IBinder> strongPointer, m_ptr ist das referenzierte Objekt. Wie Sie im Quellcode sehen können, stellt das sp-Template nur einen starken Zeiger dar, sodass das System den Speicher nicht freigibt, solange ich dieses sp halte. Es verwaltet keinen Referenzzähler. Der Zähler wird in beibehalten Referenzbasis Klasse. Und um den StrongPointer verwenden zu können, muss Ihr Objekt eine Instanz von RefBase sein.

Die RefBase-Klasse verwaltet sowohl einen starken Referenzzähler als auch einen schwachen Referenzzähler. Der einzige Unterschied besteht darin, dass das referenzierte Objekt freigegeben wird, wenn der starke Zähler auf 0 steht. Darüber hinaus kann ein von Refbase verwaltetes Objekt gleichzeitig von einigen starken und schwachen Zeigern referenziert werden.

Sie können eine weit verbreitete Verwendung von StrongPointers im Android-Framework sehen, die meisten davon sind auf dem IBinder-Objekt, ein natives Binder-Objekt kann verschiedene Prozesse durchlaufen. Verschiedene Prozesse können starke Zeiger auf dasselbe Objekt halten, das Objekt wird vom System nicht widerrufen, solange ein Prozess noch den Zeiger hält.

  • Warum nicht die Klasse sp Pflegen Sie den Referenzzähler wie wie std::shared_pointer tut? Was ist der Vorteil einer solchen Aufteilung der Verantwortlichkeiten?

    – Bob

    9. Februar 2017 um 16:23 Uhr

  • @Adrian für std::shared_ptr es ist eigentlich eine innere Klasse, die den Referenzzähler enthält; Der shared_ptr enthält einen Zeiger auf diese innere Klasse und kopiert diesen Zeiger. (hauptsächlich)

    – Paul Stelian

    1. Mai 2019 um 16:58 Uhr

Android soll in Java programmiert werden, nicht in C. Jede Dokumentation des Android-Teams würde auf diese Sprache verweisen. In Java gibt es starke und schwache Referenzen. Eine schwache Referenz hält den Garbage Collector nicht davon ab, sie zu bereinigen, eine starke Referenz schon. Sie werden auf einigen Betriebssystemen zum Zwischenspeichern verwendet, aber auf Android ab 3.0 bedeutet das Halten nur schwacher Verweise auf ein Objekt, dass es sofort gesammelt wird.

C hat kein Äquivalent einer schwachen Referenz, da es keine Garbage Collection hat.

  • Eigentlich programmiere ich den Kernel von Android, also kein Java, trotzdem danke.

    – max

    18. März 2013 um 20:54 Uhr

  • Dann sollten Sie sich nicht für schwache oder starke Referenzen interessieren 🙂

    – Bundesamt

    18. März 2013 um 20:56 Uhr

  • Ok, Sie sollten uns sagen, dass weniger als 0,1 % der Leute, die Android-Fragen stellen, an AOSP arbeiten, sie meinen Android auf Benutzerebene. Also ja, starke und schwache Zeiger sind unterschiedliche Smart-Pointer-Implementierungen und tun ungefähr dasselbe – wenn ein Zeiger den Gültigkeitsbereich verlässt, wird er nicht freigegeben, solange mindestens ein starker Zeiger darauf verweist. Wenn nur schwache Zeiger (oder nichts) referenziert werden, wird es sein. Die Überprüfung erfolgt immer dann, wenn ein starker oder schwacher Verweis darauf entschlüsselt wird.

    – Gab Sechan

    18. März 2013 um 20:59 Uhr

  • @crazyfffan Ich glaube, wir missverstehen deine Frage alle. Starke und schwache Referenzen sind nur in Java relevant. Es besteht keine Verbindung zum Kernel. Sie könnten das beste mobile Betriebssystem von ACME Corps, das in Pasvasicoboltran programmiert ist, auf Ihrem Kernel ausführen, und es würde keinen Unterschied machen. Der Kernel hat keine Kenntnis vom Benutzerland.

    – Simon

    18. März 2013 um 20:59 Uhr


  • Ja fast. Wenn Sie nur 10 schwache Zeiger haben, wäre es wahrscheinlich bereits aus dem Geltungsbereich verschwunden, als der letzte starke Zeiger aus dem Geltungsbereich ging. Die Implementierung kann es ermöglichen, dass es eine Weile länger bleibt, wenn es freien Speicher gibt, aber es wird gehackt, wenn Sie in einen Zustand mit wenig Speicher geraten, und es klingt nicht so, als wäre ihre Implementierung so weit fortgeschritten wie ihr Zitat. Und die Verwendung davon ist immer noch hauptsächlich Caching – es entspricht in etwa einem Boost von shared_ptr und einem Boost von schwachem_ptr. Im Grunde genommen kann ein schwacher Zeiger das Objekt, auf das er verweist, jederzeit verschwinden lassen.

    – Gab Sechan

    18. März 2013 um 21:20 Uhr


Dies ist ein netter Beitrag, der den Unterschied zwischen regulärer Referenz (oder “StrongReference”) diskutiert, SoftReferences, WeakReferences, und sogar PhantomReferences in Java, genießen Sie:
http://weblogs.java.net/blog/2006/05/04/understanding-weak-references

1382980cookie-checkWas sind starke Hinweise und schwache Hinweise

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy