2010-09-29 6 views
3

J'ai une question concernant la propriété et shared_ptrs en C++:C++: circularité et shared_ptr

J'ai un tas d'objets créés sur le tas. Chacun a un conteneur qui contient des pointeurs vers certains de ces objets, et parfois même un pointeur vers le même objet auquel le conteneur appartient. Depuis que je lis sur les risques de l'utilisation de shared_ptr dans de telles circonstances (circularité), je pense à la façon de le faire mieux. Heureusement, il y a une classe qui contient tous les objets en question (mais pas elle-même), donc je pensais lui en donner la propriété, de sorte que son conteneur contienne shared_ptrs alors que les objets en question contiennent des pointeurs bruts. Autrement dit, la destruction de la classe libère la mémoire allouée par le tas. Est-ce (également en termes de design) une bonne décision à prendre?

Une autre idée était de ne pas laisser les objets contenir des pointeurs, mais plutôt des identifiants uniques. Cela impliquerait une recherche pour obtenir réellement un objet via son ID, cependant, je pense que cela réduirait aussi les dépendances critiques entre les objets. Est-ce préférable?

Cordialement,

Jena

Répondre

1

Peut-être à l'aide weak_ptr peut vous aider:

boost::shared_ptr cycle break with weak_ptr

+0

@downvoter: Pourriez-vous s'il vous plaît expliquer la raison de la downvote afin de me donner une chance de s'améliorer? –

3

Vous voulez probablement regarder Boost weak_ptr.

+0

Merci pour la référence, cela semble prometteur! – jena

+0

@downvoter: Pourriez-vous s'il vous plaît expliquer la raison de la downvote afin de nous donner une chance de s'améliorer? –

2

Ceci est une réponse subjective, donc ...

La plupart du temps, lorsque vous connaissez réellement la durée de vie de vos objets et que vous contrôlez leurs dépendances, vous pouvez utiliser l'approche que vous avez indiquée. Il n'y a rien de mal, en utilisant seulement des pointeurs, quand la vie est un non-problème. L'utilisation de ids ajoute simplement un nouvel 'id' à la valeur du pointeur et ajoute ainsi une indirection 'inutile' lors de l'utilisation des objets

L'inconvénient est que vous ne pouvez (ou ne devez pas) distribuer des références aux objets à d'autres codes, ce qui peut prolonger la durée de vie de vos objets.

Lorsqu'une partie de vos collections peut prolonger la durée de vie de ses objets référencés vers quelque chose de plus long que le 'container-owner-lifetime', utilisez boost :: weak_ptr.

+0

Je pense que je suis d'accord qu'un ID unique serait un peu redondant. Je vais jeter un oeil à boost :: weak_ptr et voir si c'est approprié pour mon problème. – jena

Questions connexes