Lassen Sie mich Ihre Frage wiederholen: "Meine Frage, wie zyklische Datenstrukturen die Referenz über Null zählen lassen, weak_ptrs
bitte um Vorlage mit Beispiel im C ++ - Programm. Wie das Problem durch erneutes Beispiel bitte gelöst wird ."
Das Problem tritt bei C ++ - Code wie folgt auf (konzeptionell):
class A { shared_ptr<B> b; ... };
class B { shared_ptr<A> a; ... };
shared_ptr<A> x(new A);
x->b = new B;
x->b->a = x;
Um den zweiten Teil Ihrer Frage zu beantworten: Es ist mathematisch unmöglich, mit Referenzzählungen Zyklen zu behandeln. Daher kann a weak_ptr
(was im Grunde nur eine abgespeckte Version von ist shared_ptr
) nicht zur Lösung des Zyklusproblems verwendet werden - der Programmierer löst das Zyklusproblem.
Um dies zu lösen, muss der Programmierer die Eigentumsbeziehung zwischen den Objekten kennen oder eine Eigentumsbeziehung erfinden, wenn ein solches Eigentum auf natürliche Weise nicht besteht.
Der obige C ++ - Code kann so geändert werden, dass A B besitzt:
class A { shared_ptr<B> b; ... };
class B { weak_ptr<A> a; ... };
shared_ptr<A> x(new A);
x->b = new B;
x->b->a = x;
Eine entscheidende Frage ist: Kann verwendet weak_ptr
werden, wenn der Programmierer die Eigentumsbeziehung nicht mitteilen und aufgrund fehlender Berechtigungen oder Informationen keine statische Eigentümerschaft herstellen kann?
Die Antwort lautet: Wenn der Besitz von Objekten unklar ist, weak_ptr
kann dies nicht helfen. Wenn es einen Zyklus gibt, muss der Programmierer ihn finden und unterbrechen. Ein alternatives Mittel ist die Verwendung einer Programmiersprache mit vollständiger Speicherbereinigung (z. B. Java, C #, Go, Haskell) oder eines konservativen (= unvollständigen) Speicherbereinigungsprogramms, das mit C / C ++ funktioniert (z. B. Boehm GC). .