Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
878 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Constructeur destructeur probleme avec heritage

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Constructeur destructeur probleme avec heritage

n°1269866
bouboun
Je suis bien
Posté le 19-12-2005 à 13:22:16  profilanswer
 

Bonjour,
 
voici mon probléme
 
j'ai une class abstraite (Graph) dont herite 2 classes (DGraph et UGraph)
dans la classe abstraite je definie un destructeur virtuel qui detruit une matrice (**mat) et une liste d'adjacence
 
tout marchais correctement, cependant quand dans mon main je fais ceci :
 
cas1:
DGraph G
G=DGrap(m1,5)
//ca plante apprament au niveau du destructeur qui me dit glibc detected free() invalid pointer
par contre ceci pas de probléme
cas2:
DGrap *G
G= new DGrap(m1,5)
 
pouvez-vous m'eclairer j'ai supposé qu'on a pas le droit de faire le cas 1 car Objet statique
mais la je ne comprend pas trop alors, j'ai du zapper un principe en C++
 
ou alors j'ai une erreur dans mon destructeur dans ce cas je vous pasterai mon code
 
merci

mood
Publicité
Posté le 19-12-2005 à 13:22:16  profilanswer
 

n°1269868
Profil sup​primé
Posté le 19-12-2005 à 13:26:50  answer
 

dans le cas 1 c'est une variable locale dont la portée de vie s'arrête à la fin du corps de la méthode
dans le 2ème cas tu mémorises un pointeur sur un objet que tu as créé, et qui par conséquent n'est pas détruit lorsque tu sors du corps de la méthode où tu le créés
le destructeur n'est sans doute appelé que dans le cas 1, donc a priori un pb de destructeur

Message cité 1 fois
Message édité par Profil supprimé le 19-12-2005 à 13:31:27
n°1269869
bjone
Insert booze to continue
Posté le 19-12-2005 à 13:27:16  profilanswer
 

code et operator = ?

n°1269872
bouboun
Je suis bien
Posté le 19-12-2005 à 13:33:59  profilanswer
 


 
donc dans le cas 1 je ne peux pas faire cela ?
Enfait j'ai jamais testé cela ca fais que 3mois que je fais du c++, est dans mes tp et td, j'ai jamais fais comme cela.
 
en faisant des traces j'ai remarqué qu'aussitot avoir fait DGraph G , le destructeur est appellé
 
code et operator = ? merci de m'eclaircir

Message cité 1 fois
Message édité par bouboun le 19-12-2005 à 13:34:42
n°1269874
bouboun
Je suis bien
Posté le 19-12-2005 à 13:36:54  profilanswer
 

Code :
  1. #ifndef _GRAPH_H_
  2. #define _GRAPH_H_
  3. #include "file.h"
  4. class Graph{
  5.   //protected permettra de se servir des données membres dans la chaîne d'heritage
  6.   protected:
  7.     //representation par matrice
  8.             int **mat; //matrice contenant le poids de chaque arc
  9.             int s; //nombre de sommets
  10.  
  11.        //representation par liste d'ajacence
  12.      struct cell{
  13.     int s;
  14.     int poids;
  15.     cell *next;
  16.   }*list,*listAdj;
  17.   //methode protége
  18.   //creation d'une liste d'adjacence
  19.   //virtual void createListAdj()=0;
  20.   //virtual void setArclistAdj(int,int)=0;
  21.   virtual void dfsRec(int,int*)=0;
  22.   public:
  23.          //Destructeur Virtuel
  24.          virtual ~Graph(){
  25.     //on détruit la matrice
  26.                  for(int i=0; i<s; i++)
  27.                          delete [] mat[i];
  28.     delete [] mat;
  29.     //on détruit la liste d'adjacence
  30.    cell *temp;
  31.    for(int i=0;i<s;i++){
  32.      list=listAdj[i].next;
  33.     while(list!=NULL){
  34.       temp=list;
  35.       list=list->next;
  36.       delete temp;
  37.      }
  38.     }
  39.     delete [] listAdj;
  40.          }
  41.          //Création ou Modification d'un arc entre 2 sommets
  42.          virtual void setArc(int, int, int)=0;
  43.          //Renvoie le poids d'un arc
  44.          virtual int getArc(int, int)=0;
  45.          //Renvoie le nombre de sommets
  46.          virtual int getNbSommet()=0;
  47.          //Modifie le nombre de sommets
  48.          virtual void setNbSommet(int)=0;
  49.          //Parcours en largeur d'abord
  50.          virtual void BFS()=0;
  51.          //Parcours en profondeur d'abord
  52.          virtual void DFS()=0;
  53.          //Affichage de la matrice
  54.          virtual void affiche()=0;
  55. };
  56. #endif


 
voici ce qui nous interesse, mais je ne vois pas mon erreur et en faisant if(mat) et if(listAdj) avant les destruction c'est pareille


Message édité par bouboun le 19-12-2005 à 13:38:37
n°1269875
bjone
Insert booze to continue
Posté le 19-12-2005 à 13:37:09  profilanswer
 

si ta matrice est mallocée, et liée à ta classe DGraph par pointeur, et que tu n'as pas implémenté operator =, tu te retrouves avec instances de DGraph qui pointent sur ta matrice allouée, et à la destruction du dexuième DGraph, tu fais un free() sur un bloc mort.

n°1269876
Profil sup​primé
Posté le 19-12-2005 à 13:37:44  answer
 

bouboun a écrit :

donc dans le cas 1 je ne peux pas faire cela ?
...
en faisant des traces j'ai remarqué qu'aussitot avoir fait DGraph G , le destructeur est appellé


 
oui tu le créés mais tu le détruis tout de suite car il est déclaré en tant que variable locale
c'est pour ça que le destructeur est appelé immédiatement après sa construction dans le cas 1
et si ça plante c'est que ton destructeur comporte une erreur, tu dois essayer de désallouer un pointeur non alloué ou qui a déjà été libéré


Message édité par Profil supprimé le 19-12-2005 à 13:40:19
n°1269877
bjone
Insert booze to continue
Posté le 19-12-2005 à 13:37:50  profilanswer
 

ha ouais, tout s'explique :D

n°1269878
bjone
Insert booze to continue
Posté le 19-12-2005 à 13:39:18  profilanswer
 

et dans tes cours, on t'explique Virtual avant l'operator = ?

n°1269879
bouboun
Je suis bien
Posté le 19-12-2005 à 13:40:52  profilanswer
 

On a fait l'heritage, et aprés les operator, mais je ne comprend pas trop pourqoui il faut redefinir l'operateur =

mood
Publicité
Posté le 19-12-2005 à 13:40:52  profilanswer
 

n°1269882
bjone
Insert booze to continue
Posté le 19-12-2005 à 13:41:46  profilanswer
 

regarde bien tes cours, sur le constructeur et l'operator =.
 
si l'operator = n'est pas dans tes cours, tes profs sont à baffer, mais j'en doute.

n°1269887
bouboun
Je suis bien
Posté le 19-12-2005 à 13:48:43  profilanswer
 

je viens de relire et il dit que l'objectif et copier l 'etat d'un objet ce qui est different de création d'un objet, donc je comprend que dans mon cas je fais une reference sur un nouveau objet...donc si je veux faire ce que je veux il faudrait que je redefinisse mon operateur =
 
donc en fait j'ai pas le droit de faire le cas 1
DGraph G;
G=DGraph(m1,5);
 
 
 
je copie dans G un nouveau Objet (c'est cela) en gros ?
 
est-ce cela ou je comprend rien ?
 
typage de operator
type & operator=(const type & );

Message cité 1 fois
Message édité par bouboun le 19-12-2005 à 13:53:23
n°1269891
bjone
Insert booze to continue
Posté le 19-12-2005 à 13:50:58  profilanswer
 

j'ai pas complètement compris ta phrase, mais je crois que tu as saisi ce qu'il pourrait te manquer :D

n°1269893
Profil sup​primé
Posté le 19-12-2005 à 13:51:23  answer
 

bouboun a écrit :

.....
DGraph G;
G=DGraph(m1,5);
je copier dans G un nouveau Objet (c'est cela) en gros ?


effectivement tu copies un objet dans un autre
tu peux sans doute tenter les cours de français aussi ;)


Message édité par Profil supprimé le 19-12-2005 à 13:51:53
n°1269895
bouboun
Je suis bien
Posté le 19-12-2005 à 13:54:32  profilanswer
 

Ok merci, de votre aide, je n'avais jamais fait trop attention au typage des operateur
 
Excusez-moi pour le français

n°1269899
Profil sup​primé
Posté le 19-12-2005 à 13:57:35  answer
 

bouboun a écrit :

....
Excusez-moi pour le français


no problemo :D

n°1269903
bjone
Insert booze to continue
Posté le 19-12-2005 à 14:01:20  profilanswer
 

c'est pas le typage le problème de l'operator =, c'est qu'il existe pas là ;)


Message édité par bjone le 19-12-2005 à 14:01:32
n°1269909
bouboun
Je suis bien
Posté le 19-12-2005 à 14:08:34  profilanswer
 

oui, j'avais compris qu'il fallait le redefinir dans ce cas et j'avais mis le typage comme ça
 
En tout cas merci, de m'avoir guidé comme cela, c'était hyper constructif (ça me permet de regarder plus en avant) que de cracher une solution toute faite...
 
Encore merci

n°1269962
bjone
Insert booze to continue
Posté le 19-12-2005 à 15:11:35  profilanswer
 

ok
 
sinon pour clarifier les choses, comme exemple:
 
typemachin A,B;
 
A=B;
 
A a déjà été construit avant l'appel de l'operator =.
Il faut donc que tu fasses bien attention a voir ce que tu vas faire avec ce qui a été construit quand tu est dans l'operator =.
 

n°1270031
theshockwa​ve
I work at a firm named Koslow
Posté le 19-12-2005 à 16:08:56  profilanswer
 

et comme toujours, faire gaffe au cas où on fait A=A; [:pingouino]

n°1270033
bjone
Insert booze to continue
Posté le 19-12-2005 à 16:11:55  profilanswer
 

toutafé, j'avais oublié [:pingouino]

n°1270474
Taz
bisounours-codeur
Posté le 20-12-2005 à 09:34:51  profilanswer
 

alors utilise des std::vector<>

n°1270508
bjone
Insert booze to continue
Posté le 20-12-2005 à 10:07:28  profilanswer
 

oui, mais il faut qu'il galère un peu pour pouvoir apprécier la STL :D

n°1272082
bouboun
Je suis bien
Posté le 22-12-2005 à 21:22:12  profilanswer
 

De plus je viens du monde "java" les grandes bases...jusque java 1.4
 
Donc quand on me présente les templates, les operator, les friend , les différents heritage, la virtualité etc...
 
tout cela en 3 mois...ben ca fait un peu peur...
 
Et quand je vois des gens de DUT info qui font du c++ depuis 2-3ans et qui parfois galére...Ca me fait encore plus peur...
 
Mais bon c'est bien on apprend plein de truc c'est existant

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Constructeur destructeur probleme avec heritage

 

Sujets relatifs
problème pour passer un flux en argument d'une fonction[VBA EXCEL 03] Probleme de mise en forme auto du graph
Problème execution VB Script en ASPProblème d'écriture dans un fichier
VB 6 / Probleme EOFProbleme HTML Aide !!!
probleme requete REGEXPPHP-SQL Problème avec REGEXP
Problème avec preg_replace ...problème jeu du pendu en PHP
Plus de sujets relatifs à : Constructeur destructeur probleme avec heritage


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR