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
Antwort
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.
Der Aufruf von 'lock' für einen größeren Teil des Codes macht wirklich mehr Sinn. Gute Designentscheidung. – abergmeier
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.
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. –
@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 ... –
Nein, der Zeiger ist sicher, solange es * intern * ist. –
- 1. shared_ptr & weak_ptr Konvertierungen
- 2. Umwandlung von shared_ptr zu weak_ptr Polymorphismus
- 3. Wie shared_ptr zyklische Referenz mit weak_ptr brechen
- 4. weak_ptr, make_shared und Speicherfreigabe
- 5. weak_ptr einer Basisklasse, während shared_ptr von einer abgeleiteten Klasse ist?
- 6. Was passiert mit einem weak_ptr, wenn sein shared_ptr zerstört wird?
- 7. Ich habe einen Vektor von weak_ptr, möchte einen Vektor von shared_ptr zurückgeben
- 8. Observer Muster mit weak_ptr
- 9. Besser shared_ptr von verschiedenen Typen für "Besitz" und "Referenz"?
- 10. Was ist der Unterschied zwischen lock() und abgelaufen()? weak_ptr C++
- 11. Warum Anruf über weak_ptr ist so langsam?
- 12. Portable Hack zum Leak rohe Zeiger von weak_ptr
- 13. Wie kombiniere ich mit functor mit bind und weak_ptr
- 14. Overhead und Implementierung von shared_ptr
- 15. C++: shared_ptr von abgeleiteten und fangen Shared_ptr der Basis?
- 16. Warum hat std :: weak_ptr nicht operator->?
- 17. Kann ich einen rohen Zeiger von boost's weak_ptr bekommen?
- 18. Unterschiede zwischen tr1 :: shared_ptr und boost :: shared_ptr?
- 19. std :: unique_ptr vs std :: shared_ptr vs std :: weak_ptr vs std :: auto_ptr vs raw Zeigern
- 20. Erstellen von weak_ptr <> aus rohen Zeiger
- 21. Apple und shared_ptr
- 22. Forward-Deklarationen und shared_ptr
- 23. Schub shared_ptr und ‚this‘
- 24. Std :: shared_ptr und Vererbung
- 25. Breaking zyklische Referenzen mit std :: weak_ptr und Alias-Konstruktor: Sound oder problematisch?
- 26. Verwenden von shared_ptr in Multi-Threading-Code
- 27. Verwendung von std :: shared_ptr
- 28. Nachteile von shared_ptr
- 29. effizient vergleichen QString und std :: string für die Gleichstellung
- 30. Vergleicht man zwei char * für die Gleichstellung
Aber 'weak_ptr' hat keine 'get'-Methode. –
Derp. Missverstanden die Frage. –