Permettez-moi de répéter votre question: "Ma question, comment cyclique des structures de données rend compte de référence au-dessus de zéro, de bien vouloir nous demande de montrer l'exemple dans un programme C++. Comment le problème est résolu en weak_ptrs
nouveau avec exemple s'il vous plaît."
Le problème se produit avec le code C++ comme ceci (conceptuellement):
class A { shared_ptr<B> b; ... };
class B { shared_ptr<A> a; ... };
shared_ptr<A> x(new A); // +1
x->b = new B; // +1
x->b->a = x; // +1
// Ref count of 'x' is 2.
// Ref count of 'x->b' is 1.
// When 'x' leaves the scope, there will be a memory leak:
// 2 is decremented to 1, and so both ref counts will be 1.
// (Memory is deallocated only when ref count drops to 0)
Pour répondre à la deuxième partie de votre question: Il est mathématiquement impossible pour le comptage de référence pour traiter avec les cycles. Par conséquent, un weak_ptr
(ce qui est fondamentalement juste une version allégée de l' shared_ptr
) ne peuvent pas être utilisées pour résoudre le cycle de problème - le programmeur est la résolution du cycle de problème.
Pour le résoudre, le programmeur doit être conscient de la propriété de la relation entre les objets, ou les besoins d'inventer une propriété de la relation si pas de ce droit de propriété existe naturellement.
Ci-dessus le code C++ peut être modifié de sorte qu'Un propriétaire de B:
class A { shared_ptr<B> b; ... };
class B { weak_ptr<A> a; ... };
shared_ptr<A> x(new A); // +1
x->b = new B; // +1
x->b->a = x; // No +1 here
// Ref count of 'x' is 1.
// Ref count of 'x->b' is 1.
// When 'x' leaves the scope, its ref count will drop to 0.
// While destroying it, ref count of 'x->b' will drop to 0.
// So both A and B will be deallocated.
Une question cruciale est: Peut - weak_ptr
être utilisé dans le cas où le programmeur ne peut pas dire la propriété de la relation et ne peut pas établir de l'électricité statique à la propriété en raison de l'absence de privilège ou de manque d'information?
La réponse est: Si la propriété parmi les objets n'est pas clair, weak_ptr
ne peut pas aider. Si il y a un cycle, le programmeur a le trouver et de le briser. Une autre solution est d'utiliser un langage de programmation avec plein de collecte des ordures (tels que: Java, C#, Allez, Haskell), ou l'utilisation d'un conservateur (=imparfait) garbage collector qui travaille avec C/C++ (comme: Boehm GC).