Pointeur intelligent : classe template pour s'affranchir totalement de la gestion de la mémoire

Soyez le premier à donner votre avis sur cette source.

Vue 4 094 fois - Téléchargée 183 fois

Description

Cette classe template permet de se débarrasser totalement de la désallocation de pointeurs créés avec new.
Elle maintient en interne un compteur de références du pointeur créé, et possède la responsabilité de le deleter lorsqu'il n'est plus référencé. Il est aussi possible de partager un même objet dans plusieurs parties d'un programme, celui ci sera automatiquement effacé lorsqu'il ne sera plus référencé.

Attention : une utilisation incorrecte peut mener à la destruction multiple du même pointeur et donc à une corruption de la mémoire.
Un smart_ptr devrait TOUJOURS être initialisé directement avec un autre smart_ptr ou bien avec un pointeur créé directement avec new.
[Correct] smart_ptr<int> sp_int = new int(5); smart_ptr<int> sp_int2 = sp_int;
[Incorrect] int* p_int = new int(5); smart_ptr<int> sp_int = p_int; smart_ptr<int> sp_int2 = p_int;
Si un smart_ptr se référence lui même, le pointeur référencé ne sera jamais détruit.

Source / Exemple :


// tout est dans le zip

Conclusion :


En contrepartie de la fiabilité au niveau mémoire que l'utilisation de cette classe procure à un programme complexe, il faut à tout prix respecter le mode d'emploi et ne pas construire un smart_ptr depuis une variable qui contient un pointeur normal, mais directement depuis un pointeur renvoyé par new.
Il ne faut pas utiliser cette classe pour gérer les allocations de tableaux (comme new int[8]), car c'est delete qui est appelé pour effacer l'objet et non pas delete []

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
bah tu peux l'utiliser tranquillement sans problème :)

L'intérêt énorme est de pouvoir partager facilement le même pointeur dans plusieurs parties du code (ce qui est toujours ennuyeux, car il faut normalement établir qui a la responsabilité de l'effacer)

la tu t'ennuies pas.
si tu as :
smart_ptr a = new int(5);
smart_ptr b = a;
tu utilises a et b comme tu veux, si tu mets a 0, b continue toujours à référencer l'entier 5 (i.e. tu aurais bien *b 5).
par contre, la mémoire est bien désallouée si tu as par exemple a 0; b 0;

++
Messages postés
208
Date d'inscription
mardi 13 avril 2004
Statut
Membre
Dernière intervention
26 janvier 2009

Effectivement ça a l'air très chouette. Étant débutant en C++, je ne peux cependant pas en juger.
J'attend les commentaires des "pros" pour savoir ce qu'ils en pensent (autrement dit, y a-t-il des défauts dans ta classe ou peut-on l'utiliser telle quelle tranquillement?)
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
chouette hein ? :)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.