Constructeur destructeur probleme avec heritage

Constructeur destructeur probleme avec heritage - C++ - Programmation

Marsh Posté le 19-12-2005 à 13:22:16    

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

Reply

Marsh Posté le 19-12-2005 à 13:22:16   

Reply

Marsh Posté le 19-12-2005 à 13:26:50    

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
Reply

Marsh Posté le 19-12-2005 à 13:27:16    

code et operator = ?

Reply

Marsh Posté le 19-12-2005 à 13:33:59    


 
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
Reply

Marsh Posté le 19-12-2005 à 13:36:54    

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
Reply

Marsh Posté le 19-12-2005 à 13:37:09    

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.

Reply

Marsh Posté le 19-12-2005 à 13:37:44    

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
Reply

Marsh Posté le 19-12-2005 à 13:37:50    

ha ouais, tout s'explique :D

Reply

Marsh Posté le 19-12-2005 à 13:39:18    

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

Reply

Marsh Posté le 19-12-2005 à 13:40:52    

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

Reply

Marsh Posté le 19-12-2005 à 13:40:52   

Reply

Marsh Posté le 19-12-2005 à 13:41:46    

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.

Reply

Marsh Posté le 19-12-2005 à 13:48:43    

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
Reply

Marsh Posté le 19-12-2005 à 13:50:58    

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

Reply

Marsh Posté le 19-12-2005 à 13:51:23    

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
Reply

Marsh Posté le 19-12-2005 à 13:54:32    

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

Reply

Marsh Posté le 19-12-2005 à 13:57:35    

bouboun a écrit :

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


no problemo :D

Reply

Marsh Posté le 19-12-2005 à 14:01:20    

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
Reply

Marsh Posté le 19-12-2005 à 14:08:34    

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

Reply

Marsh Posté le 19-12-2005 à 15:11:35    

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 =.
 

Reply

Marsh Posté le 19-12-2005 à 16:08:56    

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

Reply

Marsh Posté le 19-12-2005 à 16:11:55    

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

Reply

Marsh Posté le 20-12-2005 à 09:34:51    

alors utilise des std::vector<>

Reply

Marsh Posté le 20-12-2005 à 10:07:28    

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

Reply

Marsh Posté le 22-12-2005 à 21:22:12    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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