Delete d'un pointeur

Lil35 -  
 Lil35 -
Bonjour,

j'ai un petit problème, qui a l'air tout bête, mais que je n'arrive pas à comprendre!

En fait, j'ai uneclasse cpp qui a comme membre un objet d'une autre classe cpp. dans une des fonctions de la premiere classe, je veux utliser l'un des membres de l'objet de la deuxième classe. Donc j'ai créé des variables temporaires pour recueillir ces attributs-là:

[cpp]
// dans une des fonctions de la classe 1

int* tmp_CE=NULL;
int* tmp_VE=NULL;

tmp_CE=MyDe->get_CE();//fonction de la classe 2 pour recupérer les mebre privés
tmp_VE=MyDe->get_VE();
/cpp

après un traitement je supprime les variables temporaires et je sors de la fonction:

[cpp]
delete tmp_CE, tmp_VE;
/cpp

Et maintenant, à ma grande surprise à l'itération suivante, quand je rappelle la même fonction, je decouvre que les attribut de l'objet de ma classe 2 ont été modifiés, et ce sans que je ne reconstruise l'objet! et quand je ne supprime pas du tout les variables temporaires (mais ca gonfle ma mémoire à la longue) tt se passe comme je veux..
est-ce que quelqu'un peu m'aider svp? je sens que du coup je en sais plus supprimer un pointeur!
Merci!

7 réponses

Lil35
 
Merci pour taréponse!
En fait pour la fonction get_CE et get_VE, elles sont définies dans le .h de la classe 1 par:

inline int* De_cl::get_CE(void){
return CE; //attribut de la classe 1
}

inline int* De_cl::get_VE(void){
return VE;
}

et effectivement, je ne fais pas de new pour chaque vecteur dans le même fichie, mais je fais un new pour tout l'objet MyDe que j'ai crée. et c'ets son constructeur qui fait des new.

en tout cas merci de me remettre un peu dans la théorie, je finirai par trouver!
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Ouai, c'est ce que j'essayais de lui expliqué.
De plus, utiliser un accesseur avec un pointeur, c'est un peu étrange.
Par contre, ce que je comprends pas, c'est la fuite de mémoire. à mon avis, elle viens d'ailleurs, surement de la création destruction des classes.
Je viens de lire quelques passage dédié aux new et delete dans le Stroutup, c'est pas si évident que ça de faire des new et delete sur des classes.
0
Lil35
 
Salut!
Merci pour vos réponse: oui je viens de trouver d'ou viens la fuite mémoire, et c'est que quelques part ailleurs , je supprimais des pointeurs sur des tableaux sans supprimer toutes les cases...
par contre, si j'ai bien compris, vous me dites que même si je fais un delete uniquement sur la copie, ca va changer ma variable d'origine c'est ca? dans ce cas ça va mal pour moi!
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
comme je te l'ai expliquer, tu ne détrui pas une variable, mais ce qu'elle pointe.
struct A{int* a;int *b;A(){a=new int(0);b=new int(1);}
A *cl=new A();
int * pointeur=cl->a;
delete pointeur; // ici je supprimer l'entier qui avait été créé par le constructeur de A "new int(0);"
cl->a sera donc une référence à une partie de la mémoire qui n'appatient plus au programme.

Pour bien comprendre, il faut voir les pointeurs comme des variables comme les autres qui stockent une adresse de la mémoire (qui d'ailleur est un entier non signé).
Lorsque tu fait "delete pointeur" tu libère la mémoire dont l'adresse est stocker dans "pointeur", tu ne supprime pas la variable. D'ailleurs, si tu veux, tu peux réutiliser "pointeur" la ligne suivante, par exemple :
for(;;){pointeur=new int;delete pointeur;}
est tout à fait valide.
0
Nabla's Messages postés 20731 Statut Contributeur 3 194
 
exact. avec les pointeurs, tu peux :
utiliser un pointeur pour pointer successivement plusieurs zones memoires
utiliser plusieurs pointeurs conduisant a la meme zone memoire.

Il faut bien faire attention a toujours pointer sur une zone memoire valide, et de supprimer la zone memoire des que le dernier pointeur a fini de l utiliser! Si tu respecte ces 2 regles: pas de fuite memoire, et pas d access a des zones interdites (non aloués, ou réaloués) de la memoire
-1

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

Posez votre question
Lil35
 
Merci guys pour ces explications!
J'en suis pas encore au bout de mes peines mais j'ai pas mal avancé, au moins pour la gestion de ces pointeurs
merci!
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
salut.
j'ai une règle, qui n'est pas forcément très bonne, c'est de ne faire de delete QUE si tu as fait un new avant.
Là tu ne fait pas de new.
Il faudrait que tu donnes les méthodes get_CE et get_VE() pour que je te dise de quoi il retourne.
le delete sert à détruire une variable que tu as créé à un moment du programme. Et là, tu ne créé a priori rien.
Attention surtout à ne pas confondre la variable pointeur de la "variable" pointé.
(int*) a, te défini une variable de type (int*) qui sera détruite à la fin de sa porté. Ensuite, tu peux dire que a=b; c'est a dire que prendre la valeur de b. Dans le cas d'un pointeur, une adresse mémoire (a=\x054654A).
ou alors, tu crée une nouvelle variable : a=new ...; et là il faudra un delete, car le new demande à l'OS de lui donné une certaine place mémoire qu'il faudra lui rendre (delete) après son utilisation. Par exemple si tu fait :
int * b=new int(3);
int * a=b;
tu as créé deux variable de type (int*) et une de type (int) dont l'adresse mémoire est stocké dans b.
Donc, à la libération soit tu fais delete a, soit delete b, mais pas les deux, car a==b;
Ou en explication numérique, si new renvois \x0645E, il faut libérer l'adresse mémoire \x0645E, donc :
delete \x0645E (et donc a ou b conviennent tout autant)

Mon explication n'est pas très clair et un peu en vrac, mais j'espère que ça t'aidera à comprendre.
-1
Nabla's Messages postés 20731 Statut Contributeur 3 194
 
le truc c est que commem tu n a pas fait de new, ta variable pointe sur la varible interne a l object... en gros tu te retrouves avec 2 "racourcis" vers la meme valeur. Tu modifies a partir de l un, ca modifie sur l autre aussi... et si tu fais un delete dans ces conditions, l autre racourci pointe dans le vide et alors tu finira par avoir un beau message d erreur!
les copies de pointeurs sont a utiliser avec precautions
-1