Ich verwende enable_shared_from_this<Base>
und erben dann von Base
. Wenn ich versuche, shared_from_this()
in Derived
's Konstruktor (nicht Initialisierungsliste) zu verwenden, erhalte ich eine Ausnahme. Es stellt sich heraus, dass der interne schwache Zeiger Null ist und nicht auf this
überhaupt zeigt. Wie kann das passieren? Mein anderer Anwendungsfall von genau diesem funktioniert vollkommen in Ordnung. Ich weiß nicht einmal, wo ich anfangen soll. Ich schaute auf den Quellcode von enable_shared_from_this
, und es sieht für mich so aus, dass der Zeiger immer nullptr wäre.enable_shared_from_this - leeren internen schwachen Zeiger?
Antwort
Sie können shared_from_this()
im Konstruktor des Objekts nicht aufrufen. shared_from_this()
erfordert, dass das Objekt im Besitz mindestens einer shared_ptr
ist. Ein Objekt kann nicht von einem shared_ptr
besessen werden, bevor es erstellt wird.
Ich würde vermuten, dass der interne schwache Zeiger gesetzt ist, wenn ein shared_ptr
das Eigentum an dem Objekt zum ersten Mal übernimmt. Vor diesem Punkt gibt es keine Referenzzählungsstruktur, auf die der schwache Zeiger verweisen kann.
James McNellis's answer ist richtig.
Was die Erklärung der enable_shared_from_this
Vorlage selbst, die, wie Sie erscheint beobachten nichts, Anmerkung 7 am unteren Rand des this page zu tun, erklärt:
... die Vorlage
enable_shared_from_this
hält einweak_ptr
Objekt Dies verweist auf das abgeleitete Objekt . Es gibt ein Huhn-und-Ei-Problem, obwohl, über , wie dasweak_ptr
Objekt zu initialisieren, wenn es kein entsprechendesshared_ptr
Objekt gibt. Die Umsetzung Trick ist, dass die Konstrukteure fürshared_ptr
wissen überenable_shared_from_this
, und stellen Sie dieweak_ptr
Objekt während des Baus von einshared_ptr
Objekt, das eine Ressource besitzt, dieenable_shared_from_this
als öffentliche Basisklasse hat.
Konzeptionell shared_from_this()
nimmt ein shared_ptr
zeigt auf this
und gibt eine Kopie davon.
Im Konstruktor gibt es keine shared_ptr
, die auf this
zeigt.
- 1. Kann ich einen schwachen statischen Zeiger haben?
- 2. Swift Delegation - wann schwachen Zeiger auf Delegaten verwenden
- 3. Wie std :: enable_shared_from_this :: shared_from_this funktioniert
- 4. Kann ein Zeiger in einen leeren Zeiger umgewandelt werden?
- 5. Semantik mit einem Zeiger auf einen internen Puffer verschieben
- 6. NSHashTable mit schwachen references
- 7. Verwenden von std :: enable_shared_from_this in Basisklassen
- 8. std :: enable_shared_from_this: Ist es erlaubt, shared_from_this() im Destruktor aufzurufen?
- 9. Leere auf schwachen alternierenden Automaten
- 10. Swift-Wörterbuch mit schwachen Referenztasten?
- 11. Andere Verwendungen von schwachen Referenzen?
- 12. Wie man einen schwachen Zeiger zu einem Elternteil in C++ behält?
- 13. So initialisieren Sie einen leeren Zeiger durch reflect
- 14. enable_shared_from_this nicht arbeiten an Xcode 5
- 15. unvollständige Typ Fehler Boost zur Verwendung :: enable_shared_from_this
- 16. Verwendung von enable_shared_from_this mit mehrfacher Vererbung
- 17. enable_shared_from_this und Objekte auf dem Stack
- 18. enable_shared_from_this (C++ 0x): Was mache ich falsch?
- 19. Was ist der Nutzen von `enable_shared_from_this`?
- 20. Was ist der Unterschied zwischen einer kurzen schwachen Referenz und einer langen schwachen Referenz?
- 21. Was sind starke Zeiger und schwache Zeiger
- 22. Zeiger auf Objekt == Zeiger auf erstes Mitglied?
- 23. Gute Implementierung von schwachen Wörterbuch in. NET
- 24. Was sind praktische Anwendungen der schwachen Verknüpfung?
- 25. Erstellen einer schwachen Referenz auf ein Objekt
- 26. Erklärung der schwachen Selbstzuweisung mit __typeof
- 27. ConcurrentHashMap mit schwachen Schlüsseln und Identitätshash?
- 28. Verwenden von objc_setAssociatedObject mit schwachen Referenzen
- 29. Soll das Standardmandat enable_shared_from_this öffentlich vererbt werden? Warum?
- 30. Lizenzen von internen Paketen?
Nicht wirklich ein Duplikat: http://stackoverflow.com/questions/4428023/enable-shared-from-this-c0x-what-am-i-doing-wrong –