Smart pointers

Résolu
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 - 6 févr. 2007 à 11:31
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 - 7 févr. 2007 à 10:45
Hi All,
Après une longue absence dans le forum de CS, me voici de retour avec, une fois n'est pas coutume, une petite question technique que je soumets à la communauté. Au sujet de ce billet: les "smart pointers" (ou pointeurs intelligents).

Si j'ai bien compris les différentes docs trouvées ici et là (dont une source ici même), un smart pointer permet de ne plus s'occuper de la désallocation mémoire en se basant sur un système de références. Est-ce exact?
De plus, toujours si j'ai bien compris, le smart pointer permet de ne pas allouer plusieurs fois le même objet mais de créer simplement une référence sur cet objet à chaque "allocation". Toujours exact?
Ce qui veut dire que si je fais:
Objet * pObjet1 = new Objet(3,4);

Objet * pObjet2 = new Objet(3,4);
je n'ai pas 2 objets différents mais 2 pointeurs sur le même objet.

Voici mon cas de figure (éditeur d'objets 2D):
- j'ai un manager de polygones et un manager de points
- chaque polygon ne contient pas une liste de points mais une liste d'ID de ces points qui sont stockés dans le manager de points
- la modification d'un polygone peut se faire via le manger de polygones ou via l'objet lui-même
- pour retrouver mes petits dans ces managers, j'utilise des objets map (STL) en guise de tables d'indexation, avec tous les problèmes de mise à jour que cela suppose
- aucun new ni delete: tout est alloué statiquement au cours de la session de travail

Voici maintenant mes questions:
- avez-vous une doc détaillée sur les smart pointers ou bien un exemple d'utilisation?
- d'après la description de mon cas de figure (simpliste, je l'admets), me conseillez-vous de passer aux smarts pointers?
- y a-t-il une "bonne manière" de gérer mon cas de figure?

Merci d'avance pour votre aide...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage

7 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
6 févr. 2007 à 17:44
Attention, c'est pas la classe Point qui implémente un pointeur intégillent mais l'inverse. Tu aurais alors:
set m_setOfPoints;
map m_MapIndex;


Après tu peux éclaircir avec:
typedef SmartPointer SPPoint;

set m_setOfPoints;

map m_MapIndex;
3
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
6 févr. 2007 à 20:17
Bas tu es sur d'une chose, c'est que l'objet ne sera jamais supprimé puisque ton "m_MapIndex" possède une instance. Avant d'enlever ton entrée, tu peux vérifier que ta map est la celle a posséder une instance en lisant le compteur du SmartPointer. S'il vaut 1 c'est que personne d'autre n'utilise l'object, tu peux donc le détruire sans pb. Ton "m_mapReference" est juste inclu dans le SmartPointer, sauf qu'un smartPointer est autrement plus pratique.
3
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
6 févr. 2007 à 11:34
Petite précision: l'idée étant, bien évidemment, de minimiser l'espace mémoire dans le cas de nombreux polygones (de l'ordre de 100000) avec des polygones connexes (c'est-à-dire des polygones partageant des sommets).

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
6 févr. 2007 à 13:09
Je suis un peu dans le meme cas que toi au vu de la structure que tu utilises: object + manager + Id + map.
J'utilise QUE des smartPointer puisque mes objets sont utilisés pas plusieurs "gros" objects différents. Par ailleurs, j'ai du étendre un peu les smartPointer habituelles pour permettre le polymorphisme. Si bien que mon manager d'objets gèrent et contient n'importe quel object pourvu qu'il dérive d'une classe de base.

Ya plusieurs points que je ne comprend pas:
"De plus, toujours si j'ai bien compris, le smart pointer permet de ne
pas allouer plusieurs fois le même objet mais de créer simplement une
référence sur cet objet à chaque "allocation"". Un SmartPointer reste un pointeur classique sauf que sa désallocation se fait automatiquement.

Et je ne comprend pas ce que tu veux dire:
Objet * pObjet1 = new Objet(3,4);
Objet * pObjet2 = new Objet(3,4);
je n'ai pas 2 objets différents mais 2 pointeurs sur le même objet.

Tu n'utilises pas de smartPointer la.

De la doc sur le sujet.
http://www.g-truc.net/article/smart_ptr.pdf
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
6 févr. 2007 à 14:33
Merci Luthor pour la doc (je suis déjà tombé dessus). Le souci est que je ne vois pas trop comment implémenter cette notion.
Explication. Dans mon manager de points, j'ai:
- set m_SetOfPoints; // Set de Points, rangés par position
- map m_MapIndex; // Map d'index: couple
- map m_MapReference; // Map de références: couple

C'est lourd, n'est-ce pas? Du coup, j'aimerais utiliser les smart pointers, ce qui me permettrait de fusionner les membres m_SetOfPoints et m_MapReference. Jusque là, c'est bon, non?

Du coup, je me dis que la classe Point pourrait implémenter le pointeur intelligent, pour être le plus transparent possible.
Me trompes-je?

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
6 févr. 2007 à 17:56
Effectivement, c'est plus simple vu comme ça (je comptais faire une classe Point avec un membre SmartPointer<_Point> mais je ne voyais pas l'avantage...).
Mais du coup, y'a un truc que je pige pas: comment est-ce que je sais quand virer une entrée de m_MapIndex? Avant, je le savais avec m_MapReference, mais là?

Désolé, mais quand y'a un truc qui me chiffonne, je pose pleins de questions

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
7 févr. 2007 à 10:45
Le côté pratique n'est effectivement pas à démontrer, c'est d'ailleurs pour cela que j eme posais cette question de migration.
Merci encore Luhtor pour tes conseils.
A bientôt sur CS!

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
0
Rejoignez-nous