shared_ptr & weak_ptr Konvertierungen

9

Ich versuche Objekte mit std::shared_ptr und std::weak_ptr zu jonglieren. Das Szenario sieht ungefähr so ​​aus:

Ich habe Objekte der Klasse channel , die von einer abstrakten Klasse abstract::channel (mit rein virtuellen Funktionen) abgeleitet sind. Ich habe einen Container channelContainer ( std::vector ) mit geteilten Zeigern ( std::shared_ptr ) zu channel Objects.

Jetzt habe ich eine deque (std::deque) mit schwachen Zeigern (std::weak_ptr) auf jedes Objekt in channelContainer . Benennen Sie dieses Deque freeChannelQueue .

Also sagen wir:

%Vor%

Ich bin besonders interessiert an der "Wie wandle ich einen Verweis auf ein Objekt in einen schwachen Zeiger?"

    
user2559933 08.07.2013, 08:25
quelle

3 Antworten

3

Sie können nicht

  

wandelt einen Verweis auf ein Objekt in einen schwachen Zeiger um

Sie können einen schwachen Zeiger von einem gemeinsamen Zeiger erstellen, indem Sie einfach die Zuweisung = verwenden. z.B.

%Vor%

dann

%Vor%

Achten Sie auf Lebensdauern - wird shared_ptr vor den schwachen Zeigern stehen, die auf sie zeigen?

    
doctorlove 08.07.2013 08:53
quelle
1

Ist das dein Design? Es gibt jedoch einige schwerwiegende Probleme mit der Kanallebensdauer. Zum Beispiel - wenn Code get_free_channel() aufruft, gibt Ihre Deklaration ihnen einen Verweis auf ein Objekt zurück, aber sie haben keine Möglichkeit zu garantieren, dass ihre Lebensdauer ihre Verwendung umfasst. Das kann nicht von Bedeutung sein, abhängig vom Clientcode, von dem Sie die Funktion aufrufen, aber Sie möchten wahrscheinlich ein shared_ptr zurückgeben, wie in:

%Vor%

Bezüglich "release" ...

%Vor%

Dies ist nur möglich, wenn Sie das channelContainer durchsuchen, um das Objekt zu finden, und dann von dort aus Ihr schwaches_ptr oder shared_ptr abrufen. Nochmal - Sie sollten den Prototyp wahrscheinlich ändern, damit er direkt ein shared_ptr oder weak_ptr erhält, die freie Warteschlange sperrt und dann den Smart Pointer auf .... drückt.

Alles in allem ist es schwierig, Ihnen nützliche Ratschläge zu geben, ohne zu verstehen, wie Ihre Kanallebensdauer verwaltet wird und wie verschiedene Threads versuchen könnten, die Objekte und Warteschlangen zu verwenden. Ich hoffe, das obige hilft ein wenig, wenn auch nur in einer präziseren Frage.

    
Tony Delroy 08.07.2013 08:53
quelle
0

Ich verstehe Ihre Frage so: Sie haben einen Container, in dem Sie alle Ihre Kanalobjekte speichern können, und Sie haben einen zweiten Container, um die Reihenfolge der Kanäle zu verwalten, die von Ihrer Anwendung verwendet werden können. Sie möchten dann, dass eine Schnittstelle einen Verweis auf den nächsten freien Kanal für Ihren Client zurückgibt, und wenn der Client fertig ist, gibt er den Kanal zurück an den Container.

Um einen Verweis auf einen Kanal zu erhalten, können Sie Sperren verwenden, um ein shared_ptr von Ihrem zu erstellen weak_ptr und dann dereferenzieren (nur das darunterliegende Objekt nicht löschen!). Ich sehe jedoch keinen vernünftigen Weg, um in die andere Richtung zu gehen. Sie müssten Ihren Kanalcontainer nach dem passenden Objekt durchsuchen und einen schwachen Zeiger aus dem passenden shared_ptr erneut erstellen.

Ich würde erwägen, überhaupt nicht mit weak_ptr und Referenzen zu arbeiten. Bleiben Sie einfach bei shared_ptr. Da Sie eine deque verwenden, um zu pflegen, welche Kanäle verfügbar sind, können Sie stattdessen die verfügbaren shared_ptrs dort beibehalten. Wenn Sie froh sind, dass Ihr Client die Kanäle immer freigibt, wenn Sie fertig sind, brauchen Sie vielleicht keinen Container für alle Objekte, nur die Deque für die freien Kanäle - hängt von Ihrem Gesamtdesign ab.

Wie andere bereits gesagt haben, müssen Sie die Lebensdauer Ihrer Kanalobjekte und deren Verwendung durch den Client berücksichtigen.

    
dwxw 08.07.2013 09:19
quelle

Tags und Links