Ma class de pointeurs intelligents - C++ - Programmation
Marsh Posté le 03-12-2006 à 17:12:01
C'est pas le principe de l'auto_ptr de la STL?
Je ne comprends pas le fonctionnement du compteur ref (surtout en ref* totalement maso).
Ca ne fait aucune distinction entre pointeur volatile, de pile et de tas, alloué ou non alloué (faire un delete sur un pointeur non alloué avec new c'est le crash assuré).
y en a qui vont te dire d'utiliser boost.
Edit: ah et puis le compteur ne distingue pas si c'est le même pointeur qu'on affecte ou un autre. Vraiment je ne comprends la logique.
Marsh Posté le 03-12-2006 à 17:41:33
- "C'est pas le principe de l'auto_ptr de la STL?" Non, avec auto_ptr on ne peut avoir qu'un seul pointeur valide vers le même objet...
- "y en a qui vont te dire d'utiliser boost" Oui peut-être mais je fait surtout ça pour apprendre.
"ref" est un compteur qui compte le nombre de fois que l'objet est pointé.
Donc quand "ref" arrive à 0, on peut faire un delete de l'objet.
Exemple:
{
CSmartPtr<int> pi(new int); //ref=1 (pi pointe vers un int)
CSmartPtr<int> pi2 = pi; //ref=2 (pi et pi2 pointe vers le même int)
} //pi est detruit donc ref est décrémenté de 1, ensuite pi2 est detruit donc ref tombe à 0 et je supprime le "int".
Est-ce plus clair ?
Marsh Posté le 03-12-2006 à 20:28:50
Code :
|
Marsh Posté le 03-12-2006 à 20:55:47
en même temps boost::shared_ptr<> doit se comporter de la même manière si tu lui passes un pointeur qui pointe sur un truc temporaire.
Marsh Posté le 03-12-2006 à 22:37:47
D'ailleur je ne pense pas que ça possible de régler ce problème !?
Personne ne sais comment je pourrait permettre ce genre de chose ? :
CSmartPtr<float> pf;
CSmartPtr<int> pi2(new int);
pf = (float *)pi2;
Marsh Posté le 03-12-2006 à 22:40:37
ReplyMarsh Posté le 03-12-2006 à 23:22:30
bjone a écrit : bin c'est un peu dangeureux dans l'idée |
Oui mais bon ça fonctionne quand même avec les pointeurs normals
Je vient d'éditer mon premier message en mettant la nouvelle version de ma classe CSmartPtr qui peut maintenant fonctionner avec des tableaux, qu'en pensez-vous ?:
CSmartPtr<float, arrayPtr> pi = new float[30];
CSmartPtr<float, noArrayPtr> pi2 = new float;
CSmartPtr<float> pi3 = new float;
Marsh Posté le 04-12-2006 à 19:28:56
vincent0 a écrit : Oui mais bon ça fonctionne quand même avec les pointeurs normals |
Tout dépend de ce qu'on entend par fonctionner, parce que c'est l'exemple type d'aliasing.
Note: un pointeur normal, des pointeurs normaux.
Marsh Posté le 04-12-2006 à 20:00:16
J'ai un autre problème moins dangereux et plus important (comme ça tout le monde sera heureux )
Code :
|
Comment feriez-vous pour que ce code compile et fonctionne correctement ? merci...
Marsh Posté le 03-12-2006 à 16:47:54
Hello.
J'ai fait une classe de pointeur intelligent avec compteur de référence et j'aimerais bien savoir ce que vous en pensez.
- Voyez-vous des erreurs ou des améliorations possible à faire ?
- Y a-t-il des choses que l'ont peut faire avec un pointeur normal et qu'ont ne peut pas faire avec ma classe ?
Quand je fait ceci, j'ai une erreur à la compilation, comment pourrait-je régler le problème ? :
CSmartPtr<float> pf;
CSmartPtr<int> pi2(new int);
pf = (float *)pi2;
En vous remerciant.
Message édité par vincent0 le 03-12-2006 à 23:20:36