OVH Cloud OVH Cloud

map::insert()

9 réponses
Avatar
Flzw
Bonjour,

J'ai quelquechose du genre

ObjectList.insert(make_pair(key, CObject(Name,Arg)));

Et euh, ca marche pas, la taille de ObjectList est bien augmentée etc,
mais l'objet inséré inséré est créé et puis detruit juste apres je vois pas
pourquoi...

9 réponses

Avatar
Cyrille Karmann
"Flzw" disait:
Bonjour,

J'ai quelquechose du genre

ObjectList.insert(make_pair(key, CObject(Name,Arg)));

Et euh, ca marche pas, la taille de ObjectList est bien augmentée
etc,
mais l'objet inséré inséré est créé et puis detruit juste apres je vois
pas pourquoi...


L'objet "CObject(Name,Arg)" est un objet temporaire qui est détruit
(probablement) après l'appel de make_pair. Mais la map en conserve une
copie.

Je suppose que puisque tu dis que l'objet "est créé et puis détruit",
c'est que tu repère d'une manière ou d'une autre les passages dans le
constructeur et le destructeur. Mais tu n'as peut-être pas pensé au
constructeur de copie qui est créé par le compilateur même si tu ne le
l'écris pas toi-même.

--
Cyrille

Avatar
Flzw
"Cyrille Karmann" wrote in message
news:411e48ae$0$6132$
"Flzw" disait:
Bonjour,

J'ai quelquechose du genre

ObjectList.insert(make_pair(key, CObject(Name,Arg)));

Et euh, ca marche pas, la taille de ObjectList est bien augmentée
etc,
mais l'objet inséré inséré est créé et puis detruit juste apres je vois
pas pourquoi...


L'objet "CObject(Name,Arg)" est un objet temporaire qui est détruit
(probablement) après l'appel de make_pair. Mais la map en conserve une
copie.


C'est bien ce que je pensais.

Je suppose que puisque tu dis que l'objet "est créé et puis détruit",
c'est que tu repère d'une manière ou d'une autre les passages dans le
constructeur et le destructeur. Mais tu n'as peut-être pas pensé au
constructeur de copie qui est créé par le compilateur même si tu ne le
l'écris pas toi-même.


En effet le destructeur est appelé plus de fois que le constructeur, je
trouvais ca etrange, existe t il une facon d'avoir le meme resultat en ne
creant qu'une instance de l'objet en tout et sans necessiter un constructeur
par defaut ni un operateur de copie, merci.


Avatar
Cyrille Karmann
"Flzw" disait:

Je suppose que puisque tu dis que l'objet "est créé et puis détruit",
c'est que tu repère d'une manière ou d'une autre les passages dans le
constructeur et le destructeur. Mais tu n'as peut-être pas pensé au
constructeur de copie qui est créé par le compilateur même si tu ne le
l'écris pas toi-même.


En effet le destructeur est appelé plus de fois que le constructeur, je
trouvais ca etrange, existe t il une facon d'avoir le meme resultat en
ne creant qu'une instance de l'objet en tout et sans necessiter un
constructeur par defaut ni un operateur de copie, merci.


Ben... si vous voulez le contrôle total de la durée de vie de vos
objets, vous pouvez le créer dynamiquement.

CObject *obj = new CObject(Name,Arg);
ObjectList.insert(make_pair(key, obj));

// ....
delete obj;

L'ennui, c'est bien sûr qu'il ne faut pas oublier d'appeler delete, et
qu'il faut éviter de l'appeler tant que ObjectList contient encore un
pointeur sur l'objet, sinon un bout de votre code risque de vouloir s'en
servir et si vous l'avez détruit, ça fera kaboum.

Il y a peut-être moyen de s'en tirer avec des "pointeurs intelligents"
avec compteur de références, mais je ne suis pas très au fait de ce
genre de techniques.

--
Cyrille


Avatar
Flzw
Ben... si vous voulez le contrôle total de la durée de vie de vos
objets, vous pouvez le créer dynamiquement.

CObject *obj = new CObject(Name,Arg);
ObjectList.insert(make_pair(key, obj));

// ....
delete obj;



Ok donc il faut que je passe sur du std::map <string, CObject*>

Merci.

Avatar
drkm
"Flzw" writes:

En effet le destructeur est appelé plus de fois que le constructeur, je
trouvais ca etrange,


Ce n'est pas normal. Par contre, si tu n'as qu'un destructeur, tu
peux cependant avoir plusieurs constructeurs. Peut-être la confusion
vient-elle de là ?

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html

Avatar
Flzw
Ce n'est pas normal. Par contre, si tu n'as qu'un destructeur, tu
peux cependant avoir plusieurs constructeurs. Peut-être la confusion
vient-elle de là ?


Non je n'ai qu'un constructeur, mais comme suggeré plus haut, le compilateur
appelle peut etre un constructeur de copine par defaut qu'il a fait lui meme
?

Avatar
Pierre Maurette
"Flzw" a écrit:
[...]
appelle peut etre un constructeur de copine par defaut qu'il a fait lui meme
?
Un constructeur de copine, ça m'intéresse, je suis un peu "à la rue"

actuellement. Si vous pouviez m'en faire uns ... copine ?
--
Pierre

Avatar
Fabien LE LEZ
On Sun, 15 Aug 2004 12:20:55 +0200, Pierre Maurette
:

Un constructeur de copine, ça m'intéresse, je suis un peu "à la rue"
actuellement. Si vous pouviez m'en faire uns ... copine ?


Fais gaffe au cast (pas toujour explicite) de "copine" vers
"épouse"...
http://www.naute.com/blagues/epouse1.0.phtml


--
;-)

Avatar
drkm
"Flzw" writes:

Ce n'est pas normal. Par contre, si tu n'as qu'un destructeur, tu
peux cependant avoir plusieurs constructeurs. Peut-être la confusion
vient-elle de là ?


Non je n'ai qu'un constructeur, mais comme suggeré plus haut, le compilateur
appelle peut etre un constructeur de copine


:-D

par defaut qu'il a fait lui meme
?


C'est bien ce que je voulais dire. Remarque que constructeur de
copie et constructeur par défaut sont deux choses différentes.

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html