2012-06-10 7 views
10

Während verstehe ich, warum nicht dort ist operator== für shared_ptr und unique_ptr, frage ich mich, warum niemand dort für shared_ptr und weak_ptr ist. Vor allem, da Sie eine weak_ptr über eine Referenz auf shared_ptr erstellen können. Ich würde annehmen, dass Sie für 99% der Zeit lhs.get() == rhs.get() möchten. Ich würde jetzt weitermachen und das in meinen Code einführen, wenn mir nicht jemand einen guten Grund nennen könnte, warum man so etwas nicht tun sollte.Fehlende Gleichstellung von shared_ptr und weak_ptr

+3

Aber 'weak_ptr' hat keine 'get'-Methode. –

+0

Derp. Missverstanden die Frage. –

Antwort

15

weak_ptr doesn 'haben eine get() Methode, weil Sie die weak_ptr explizit sperren müssen, bevor Sie auf den zugrunde liegenden Zeiger zugreifen können. Dies explizit zu machen, ist eine bewusste Designentscheidung. Wenn die Umwandlung implizit wäre, wäre es sehr einfach, Code zu schreiben, der unsicher wäre, wenn die letzte shared_ptr für das Objekt zerstört würde, während der darunterliegende Zeiger, der von der weak_ptr erhalten wurde, noch untersucht wurde.

This boost page hat eine gute Beschreibung der Fallstricke und warum weak_ptr hat solch eine begrenzte Schnittstelle. Wenn Sie einen schnellen Vergleich durchführen müssen, können Sie shared == weak.lock() tun. Wenn der Vergleich wahr ist, wissen Sie, dass weak immer noch gültig sein muss, da Sie ein separates shared_ptr für das gleiche Objekt halten. Es gibt keine solche Garantie, wenn der Vergleich falsch zurückgibt.

+0

Der Aufruf von 'lock' für einen größeren Teil des Codes macht wirklich mehr Sinn. Gute Designentscheidung. – abergmeier

4

Weil es einen Preis hat.

Ein weak_ptr ist wie ein Beobachter, kein echter Zeiger. Um irgendeine Arbeit damit zu erledigen, müssen Sie zuerst eine shared_ptr von ihr mit seiner lock() Methode erhalten.

Dies hat den Effekt, Eigentum zu erwerben, aber es ist so teuer wie das Kopieren eines regulären shared_ptr (Zählung Inkrement, etc ...), so ist es nichts triviales.

Als solche, indem Sie == nicht zur Verfügung stellen, sind Sie gezwungen zurückzutreten und tatsächlich zu überprüfen, ob Sie das wirklich brauchen oder nicht.

+2

Ich bin nicht sicher, ob der Vergleich der Gleichheit sich um die Gültigkeit kümmern muss und als solche billig implementiert werden könnte: Entweder bezieht sich das "schwache_ptr" auf dieselbe Entität, in diesem Fall muss es gültig sein (oder 0) oder es bezieht sich darauf eine andere Entität, in welchem ​​Fall es uns egal ist, ob es gültig ist. –

+0

@KonradRudolph: vielleicht, vielleicht nicht. Aber weil das Erhalten des Zeigers im allgemeinen unsicher wäre (da Sie den Zeiger haben würden, aber nicht auf den Zeiger zugreifen könnten), können Sie den Zeiger nicht von "weak_ptr" erhalten und werden gezwungen, ein 'shared_ptr' zu durchlaufen. Also ... –

+1

Nein, der Zeiger ist sicher, solange es * intern * ist. –

Verwandte Themen