Ich habe Objektstruktur, die von shared_ptr
s gemacht wird, plus weak_ptr
s, um Zirkularität zu vermeiden. Raw Pointer sind ein No-Go als boost::serialization
muss freigegebene und schwache Zeiger beim Deserialisieren via Objekt-Tracking als Serialisierungszeit wiederherstellen. Objektlebensdauermuster sind komplex (Partikelsimulation), aber vollständig vorhersagbar. Immer wenn ich weak_ptr::lock()
benutze, bin ich sicher, dass der Zeiger immer noch gültig ist. Normalerweise verwende ich lock().get()
, da ich das Objekt nur für eine sehr kurze Zeit brauche.Portable Hack zum Leak rohe Zeiger von weak_ptr
Jetzt hat lock().get()
Auswirkungen auf die Leistung, da es die gemeinsame Zählung erhöht (in lock()
), und dann dekrementiert es kurz danach (die temporäre shared_ptr
ist zerstört).
Diese boost.devel post von 2002 sagt, dass, während weak_ptr
entwickelt wurde, die Funktionalität der Rohzeiger direkt betrachtet wurde der Zugriff (zu unsafe_get
oder leak
genannt werden), aber nie hat es auf die tatsächliche Umsetzung. Seine Abwesenheit zwingt Programmierer, unter gegebenen Bedingungen eine suboptimale Schnittstelle zu verwenden.
Nun ist die Frage, wie die unsafe_get
/leak
, in anderen Worten zu emulieren, erhalten die Rohzeiger von weak_ptr
, ungültig auf Gefahr des Programmierers, nur zu lesen (nicht zu schreiben) Daten. Ich kann mir vorstellen, dass einige Tricks wie das Finden des Offsets des rohen Zeigers innerhalb von shared_ptr
oder dergleichen den Job erledigen würden.
Ich benutze boost::shared_ptr
, aber die Lösung könnte auch für C++ 11 std::shared_ptr
arbeiten.
Gute Frage, aber es klingt ehrlich wie rohe Zeiger wäre hier der bessere Deal. Verwalten Sie die Objekte separat (z. B. alle Ihre Partikel in einem Container zusammenfassen) und weiche Zeiger auf diese weiter. –
Ich denke, selbst wenn Sie nur das Objekt für eine kurze Zeit verwenden, sollten Sie das 'shared_ptr' halten, während Sie es verwenden:' auto s = w.lock(); if (s) s-> doSomething(); 'Ich denke mit' lock(). get() 'ist eine schlechte Übung und nicht schneller. Es ist möglich, dass genau die Aktion der Verwendung des Zeigers tatsächlich das letzte 'shared_ptr' zum Sterben auslösen könnte. –
Wenn Sie wissen, dass die Schwachstellen auf Objekte ohne ".lock()" zeigen, verwenden Sie kein 'weak_ptr'. Haben Sie nebenbei bemerkt, dass dies ein Leistungsengpass ist? – Yakk