[C++] Probleme de libération de mémoire

Probleme de libération de mémoire [C++] - C++ - Programmation

Marsh Posté le 07-01-2003 à 14:45:14    


J'ai un objet A qui contient un pointeur (un tableau), donc dans le destructeur je libere ce tableau. Ca plante parce que plusieurs pointeurs dans  l'objets A pointent sur le meme tableau (c'est pas voulu)
 
Donc  j'ai   surcharger l'opérateur = pour que il ne copie pas le pointeur mais crée un nouveau tableua identique au premier.
Mais il y a toujours plusieurs pointeurs avec la meme valeur (donc ça merde ).
 
Que faire ??  
 
(quand on passe un object en paramètre d'une fonction, il utilise bien = ?)

Reply

Marsh Posté le 07-01-2003 à 14:45:14   

Reply

Marsh Posté le 07-01-2003 à 14:51:05    

un morceau de code? peut etre devrais tu utiliser les std::vector<>

Reply

Marsh Posté le 07-01-2003 à 14:55:09    

Dis moi si je comprends bien : tu as dans ta classe une variable membre qui est un pointeur vers un tableau membre ?
Quand tu détruis l'objet, forcément tu libères le tableau (j'espère en tout cas). Il suffit donc de rajouter la ligne
 
pointeur = NULL;
 
dans le destructeur
 
mais je doute que ce soit aussi simple. poste ton code si tu peux


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-01-2003 à 15:07:21    

je ne peux pas poster le code , y'en a vraiment trop long (ça fait 3 ans que je suis dessus....j'avais laissé tomber cette désallocation, mais là ya besoin.)
 
Je fait exactement ce que tu dis Harkonnen.
 
Le problème est qu'à certains moments cette objet est copié (explicitement ou par le c++ (genre quand j'en passe un en paramètre de fonction) et que ce pointeur ce retrouve dupliqué dans plusieurs objets (donc dès qu'il y a un de ces objets qui est libéré, ceux qui ont le même pointeur plantent (normal)) .  
 
Pourtant j'ai bien surchargé operator= pour qu'il ne copie pas le pointeur mais alloue un nouveau tableau.

Reply

Marsh Posté le 07-01-2003 à 15:10:06    

En fait ma question est :  
 
la surcharge de operator= est suffisante pour que ça marche si le reste est bien codé ?

Reply

Marsh Posté le 07-01-2003 à 15:10:37    

mokett a écrit :


J'ai un objet A qui contient un pointeur (un tableau), donc dans le destructeur je libere ce tableau. Ca plante parce que plusieurs pointeurs dans  l'objets A pointent sur le meme tableau (c'est pas voulu)
 
Donc  j'ai   surcharger l'opérateur = pour que il ne copie pas le pointeur mais crée un nouveau tableua identique au premier.
Mais il y a toujours plusieurs pointeurs avec la meme valeur (donc ça merde ).
 
Que faire ??  
 
(quand on passe un object en paramètre d'une fonction, il utilise bien = ?)


 
Attention à pas confondre le contructeur de copie A(const A&) et l'operateur d'assignation operator=(const A&). Et si ton objet doit se trimballer des pointeurs alloués t'as intérêt à toujours définir les deux ! En l'occurence les paramètres de la fonction sont des objets temporaires créés pour l'occasion: c'est le constructeur de copie qui est utilisé.
 
Sinon le plus simple c'est de stocker ton tableau dans un std::vector, le résultat est le même sauf que tu ne t'occupe plus de faire les free et les delete
 

Reply

Marsh Posté le 07-01-2003 à 15:18:10    

on peut aussi définir operator= enfonction d'une fonction membre swap qui fait alors appel au constructeur de recopie

Reply

Marsh Posté le 07-01-2003 à 15:23:12    

Captain ad-hoc a écrit :


 
Attention à pas confondre le contructeur de copie A(const A&) et l'operateur d'assignation operator=(const A&). Et si ton objet doit se trimballer des pointeurs alloués t'as intérêt à toujours définir les deux ! En l'occurence les paramètres de la fonction sont des objets temporaires créés pour l'occasion: c'est le constructeur de copie qui est utilisé.
 
Sinon le plus simple c'est de stocker ton tableau dans un std::vector, le résultat est le même sauf que tu ne t'occupe plus de faire les free et les delete
 
 


 
merci c'est surement ça.

Reply

Marsh Posté le 07-01-2003 à 15:28:54    

Ok c'est bon merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed