SMART POINTER

Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
- - Dernière réponse : VoidSeer
Messages postés
1
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
12 octobre 2005
- 12 oct. 2005 à 14:42
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/20391-smart-pointer

Afficher la suite 
VoidSeer
Messages postés
1
Date d'inscription
mercredi 12 octobre 2005
Statut
Membre
Dernière intervention
12 octobre 2005
-
Du classique ;-)
Pour approfondir le sujet, la meilleure référence AMA reste 'More Effective C++
de Scott Meyers, chez Addison-Wesley. Les items 28 et 29, traitent exactement de ce sujet, avec le code en prime.

Quelques remarques sur le code néanmoins :
- Quand on inclue des fichiers d'entête C, il est mieux d'utiliser ceux conçus
pour le C++, qui encapsulent les fonctions standard dans le namespace std.
Donc , et <stdlib.h> deviennent <cstdlib>, <cassert>

- On n'utilise pas NULL en C++, on utilise 0. Y'a une grande justification
derriere tout cela, assez technique d'ailleurs.

- Tester si un smart pointer est nul est un point délicat. L'implémentation
proposée ici utilise une fonction membre. C'est bien, cependant cela pose
un problème. Le Smart Pointer ne se comporte plus comme un pointeur.
Le principe d'une bonne implémentation de Smart Pointer est qu'il puisse se
substituer de manière transparente à un pointeur classique. Là ce n'est pas
le cas.
La solution proposée en général est d'implanter l'opérateur operator!.
Ce qui permet d'écrire:
if (!ptr) {/* Pointeur ou SmartPointer non null*/}

- Je ne vois pas l'intérêt de définir le destructeur comme virtuel. Au
contraire. La classe n'a pas a priori vocation à être surchargée, est ne
définir aucune fonction virtuelle fera l'économie de la création de la
vtable. Ce qui est plutot souhaitable pour une classe dont les instances
se substituent à un type scalaire.
BlackGoddess
Messages postés
338
Date d'inscription
jeudi 22 août 2002
Statut
Membre
Dernière intervention
14 juin 2005
-
c'est du C, c'est protable C++ >> si tu savais les difficultés qu'on peut rencontrer en encapsulant du c dans du c++ ...

ok tibur :)
ds les lib boost il y a 5 smart pointers aussi pour ceux que ca interresse :)
www.boost.org
cs_tibur
Messages postés
101
Date d'inscription
samedi 9 février 2002
Statut
Membre
Dernière intervention
5 mai 2009
-
> bah ... et alors ???

Je suis d'accord pour le debugging. Par contre tu ne peux pas redefinir l'operator = en C. Alors je vois pas l'interet de faire un smart pointer !

Peut etre que j'ai mal compris ta facon de faire ... Fait donc un post de ton code.
cs_tibur
Messages postés
101
Date d'inscription
samedi 9 février 2002
Statut
Membre
Dernière intervention
5 mai 2009
-
> sinon c pas une copie de l'auto_ptr de la STL ca des fois ? :p

Nan : je viens de regarder comment marche le auto_ptr. Tu n'as pas de comptage de reference.

Je te fais un copier / coller de l'operateur = entre 2 auto_ptr :

auto_ptr<_Ty>& operator=(auto_ptr_ref<_Ty>& _Right) throw ()
{ // assign compatible _Right._Ref (assume pointer)
reset(_Right._Ref.release());
return (*this);
}

Il fait un release sur le auto_ptr right. Ca veut dire que ce code plante :

typedef std::auto_ptr<double> DoublePtr;
DoublePtr p1(new double(5.0));
DoublePtr p2 = p1;
std::cout << *p1 <<std::endl;

Car p1 n'est plus valide. Avec ces SmartPointer, tu peux avoir plusieurs pointeurs pointant en meme temps sur le même objet.
cs_JCDjcd
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
2 -
bah ... et alors ??? moi mes trucs font exatement la meme chose que ceux de cette source ! De plus ils contiennent plus d'infomration de debug, donc je ne foi pas ou est le probleme, surtout comme c'est du C, c'est protable C++ !!