A voir également:
- Delete d'un pointeur
- Delete lock - Télécharger - Sécurité
- Delete hiberfil.sys - Guide
- Delete cascade sql - Forum Programmation
- Pointeur satellite eutelsat 5wa - Forum Satellite
- Comment faire apparaître le pointeur de la souris - Guide
7 réponses
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!
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!
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 329
12 août 2008 à 10:56
12 août 2008 à 10:56
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.
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.
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!
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!
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 329
12 août 2008 à 15:52
12 août 2008 à 15:52
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.
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.
Nabla's
Messages postés
18149
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
3 219
13 août 2008 à 10:31
13 août 2008 à 10:31
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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!
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!
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 329
11 août 2008 à 11:10
11 août 2008 à 11:10
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.
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.
Nabla's
Messages postés
18149
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
3 219
12 août 2008 à 09:20
12 août 2008 à 09:20
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
les copies de pointeurs sont a utiliser avec precautions