begin process at 2012 05 30 09:54:51
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

Smart pointers


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Smart pointers

mardi 6 février 2007 à 11:31:21 | Smart pointers

buno

Administrateur CodeS-SourceS
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
mardi 6 février 2007 à 11:34:24 | Re : Smart pointers

buno

Administrateur CodeS-SourceS
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
mardi 6 février 2007 à 13:09:42 | Re : Smart pointers

luhtor

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

mardi 6 février 2007 à 14:33:50 | Re : Smart pointers

buno

Administrateur CodeS-SourceS
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<Point, PointSort> m_SetOfPoints; // Set de Points, rangés par position
- map<unsigned int, Point *> m_MapIndex; // Map d'index: couple <ID, Point *>
- map<unsigned int, unsigned int> m_MapReference; // Map de références: couple <ID, Nb Références>

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
mardi 6 février 2007 à 17:44:40 | Re : Smart pointers

luhtor

Réponse acceptée !
Attention, c'est pas la classe Point qui implémente un pointeur intégillent mais l'inverse. Tu aurais alors:
set<Point, PointSort> m_setOfPoints;
map<ID, SmartPointer<Point> > m_MapIndex;

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

set<Point, PointSort> m_setOfPoints;
map<ID, SPPoint > m_MapIndex;


mardi 6 février 2007 à 17:56:47 | Re : Smart pointers

buno

Administrateur CodeS-SourceS
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
mardi 6 février 2007 à 20:17:57 | Re : Smart pointers

luhtor

Réponse acceptée !
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.
mercredi 7 février 2007 à 10:45:53 | Re : Smart pointers

buno

Administrateur CodeS-SourceS
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


Cette discussion est classée dans : points, objet, objets, smart, pointers


Répondre à ce message

Sujets en rapport avec ce message

[Allegro] Animation d'objets [ par GoldenEye ] La situation est simpleOn est en true color (Allegro)J'ai un décor de fond statique (BITMAP *decor)J'ai un petit objet mobile (BITMAP *objet)Le petit creation d'objets dans une boucle [ par sampq ] Je cree un objet dans une boucle que je donne en parametre à un autre objet, un truc du style:for(int i=0; i{ objet_1 o1(i); objet_2 o2( pb avec delete c++ [ par djl ] je cree un tableau d'objets dynObjet** objets;objets = new Objet*[l];for(int i=0;icomment on le detruit?car je fait cafor(int i=0;idelete[] objets;e de l'objet et du c++ pour un debutant [ par zarbiman ] salut tout le monde, je debute en c++ objet, et j'ai un petit probleme: j'ai un projet qui utilise des objets, mais dans les fichiers headers que j'ai gestion d'une multitude d'objets, interactions dans l'espace [ par cppdupdup34 ] alors voila j'ai une petite question !Comment gerer une multitude d'objets géométriques dans un espace tridimensionnel ?A titre d'exemple, sur une map Tri de tableau d'objets... [ par dbiare ] Bonjour J’ai un petit souci en Visual C++6… Je détiens, après traitement, deux indices (i et j) d’un même tableau d’objet : m_oaBras[]. Je dois permut utilisation de delete sur des objets... ca marche comment ? [ par vincemail ] Bonjour, je voudrais savoir comment fonctionne delete sur des objets.. Par exemple j'ai un objet Tableau qui contient un membre *tableau (qui est bien 3DS max et openGL [ par Amanobuo ] Bonjour, je sais qu'il existe deja des postes sur la compaptibilite 3DS max / openGL mais j'aimerais quand meme poser des questions precises ^^ 1) Et plan de coupe 3D sur objet [ par jcloupgarou ] Bonjour,je réalise un modeleur pour un projet info et je dois ajouter un outil permettant de faire des plans de coupe 3d des objets modélisés, donnant Quelle est la meilleur solution pour deplacer des objets independemment [ par adess00 ] Coucou Je fais un structure qui enregistre la position de chaque objets dans ma scene Et je voudrais savoir quelle est la meilleur methode Voici cell


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 6,802 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales