2017-04-19 9 views
0

Ich versuche, die in der Abbildung unten gezeigten Beziehungen zu erstellen. A erstellt ein B-Objekt als gemeinsamen Zeiger. Es geht dann weiter, den geteilten Zeiger zu einem Bündel von D'zu übergeben.Verwalten von sharedPointers C++

Wenn jedoch ein B erstellt wird, erstellt es ein C-Objekt, das vor A verborgen werden soll und nur von B bekannt ist. Obwohl C wissen muss, dass B funktioniert.

Da ein geteilter Zeiger bereits auf B gesetzt ist, gibt es eine Möglichkeit, diesen gemeinsamen Zeiger innerhalb des Konstruktors von B an C zu übergeben?

Natürlich kann ich es machen, indem Sie den this -Zeiger an C übergeben, und speichern Sie es als einen rohen Zeiger. Aber was passiert, wenn B zerstört wird? Dann würde C versuchen, den B-Zeiger zu löschen, aber da das gerade gelöscht wird, was passiert dann?

Ich hoffe, Sie können das für mich sortieren.

Mit freundlichen Grüßen.

enter image description here

+0

'C' ist ein Mitglied Objekt von' B' richtig? – NathanOliver

+1

Warum sollte C versuchen, B zu löschen? Die Lebensdauer von B wird von shared_ptrs verwaltet, nicht von C. – nwp

+2

@nwp Das macht eigentlich Sinn. Wenn B gelöscht wird, wenn refCount 0 ist, würde es C löschen. C müsste dann den Zeiger nicht löschen, da das Objekt, auf das es verweist, B bereits gelöscht ist? –

Antwort

2

Wenn ich Sie richtig verstehe, dann könnte Bstd::enable_shared_from_this, erben und einen gemeinsamen Zeiger von selbst passieren, wenn es die C Objekte erstellt wird. Möglicherweise sollte das C Objekt stattdessen ein std::weak_ptr zu seinem "übergeordneten" B Objekt haben.

Ohne schwachen Zeiger der Lebensdauer der C Objekte muss vollständig vom B Objekt verwaltet werden.


Wenn auf der anderen Seite das B Objekt die Lebensdauer der C Objekte verwaltet, dann ist die C Objekte möglicherweise nicht einen freigegebenen Zeiger auf das B Objekt benötigen, sondern einen nicht besitzen (plain roh) Zeiger auf das Objekt B.

+0

Richtig verwenden. Wie @nwp erwähnt, überlebt B C, daher ist ein normaler Zeiger ausreichend. Vielen Dank. –

+1

Ihre Lösung führt zu Speicherlecks. – user3188346

+0

@ user3188346 Wo? –