2009-08-11 6 views
1

Existe-t-il une directive rigide indiquant quand utiliser de préférence boost :: shared_ptr sur un pointeur normal (T *) et inversement?Consignes d'utilisation: pointeurs partagés par rapport aux pointeurs normaux

+0

Vous pensez à 'boost :: shared_ptr' et' std :: tr1 :: shared_ptr'? – bdonlan

+0

Vous ne devriez pratiquement jamais utiliser un pointeur RAW. Mais ils sont plusieurs pointeurs partagés pour différentes situations. Voir http://stackoverflow.com/questions/94227/smart-pointers-or-who-owns-you-baby –

Répondre

2

Ma règle générale est la suivante: lorsque la mémoire est souvent transmise et qu'il est difficile de dire à quoi appartient cette mémoire, des pointeurs partagés doivent être utilisés. (Notez que cela peut également indiquer une conception médiocre, pensez donc aux choses avant de passer aux pointeurs partagés.) Si vous utilisez des pointeurs partagés à un endroit, vous devriez essayer de les utiliser partout. Si vous ne le faites pas, vous devrez faire très attention à la manière dont vous contournez les pointeurs pour éviter les doubles libertés.

Si votre utilisation de la mémoire est simple et que la mémoire vous appartient, utilisez simplement des pointeurs normaux.

Généralement, plus votre projet est gros, plus vous tirerez profit des pointeurs partagés. Il n'y a pas de règles rigides à ce sujet et il ne devrait pas y en avoir. Comme pour de nombreuses décisions de développement, il y a des compromis et vous devez faire ce qu'il y a de mieux pour vous.

+1

Ma règle est que s'il est difficile de dire "à quoi appartient cette mémoire", vous avez un mauvais design. L'application d'une bande de pointage partagée ne va pas le réparer. –

+0

@NNeil, rendant la propriété du pointeur explicite n'a rien à voir avec le design. –

+0

La propriété de @jon, avec la durée de vie, est l'un des deux problèmes les plus importants que toute conception doit adresser et spécifier –

2

Un guide simple qui élimine presque la possibilité de mémoire fuites est: toujours utiliser une variable de pointeur intelligent nommé pour tenir le résultat de nouvelle.

boost::shared_ptr documentation

+1

Si vous êtes seulement préoccupé par les fuites de mémoire avec new, vous pouvez utiliser 'auto_ptr' et ne pas avoir la surcharge d'un' shared_ptr'. –

+0

Tant que rien, vous le savez, partage le pointeur avec l'objet de création. –

+0

La sémantique de copie non-standard de auto_ptr peut vous mordre si vous ne faites pas attention. –

1

Sauf si vous construisez un pointeur intelligent (ne pas) alors vous ne devriez probablement pas utiliser un pointeur RAW (Ce chemin mène à la folie).

Il y a un ensemble de pointeurs intelligents pour différentes situations:
std :: auto_ptr:
std :: tr1 :: shared_ptr AKA (boost :: shared_ptr)
boost :: scoped_ptr
boost :: weak_ptr

Smart Pointers: Or who owns you baby?

La seule raison pour passer un pointeur est de passer une référence à un objet qui pourrait potentiellement être NULL (sinon utiliser une référence) à dire que vous êtes PAS en passant la propriété juste à l'utilisation de l'objet (et si vous passez NULL peut-être vous devriez regarder le code et demander pourquoi).

Les conteneurs std ne gèrent pas bien les références de sorte que vous pouvez mettre des pointeurs vers des objets appartenant à quelqu'un d'autre dans un conteneur standard (voir Using abstract class as a template type)