Constructeur destructeur probleme avec heritage - C++ - Programmation
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
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
Marsh Posté le 19-12-2005 à 13:36:54
Code :
|
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
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.
Marsh Posté le 19-12-2005 à 13:37:44
bouboun a écrit : donc dans le cas 1 je ne peux pas faire cela ? |
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é
Marsh Posté le 19-12-2005 à 13:39:18
et dans tes cours, on t'explique Virtual avant l'operator = ?
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 =
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.
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 & );
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
Marsh Posté le 19-12-2005 à 13:51:23
bouboun a écrit : ..... |
effectivement tu copies un objet dans un autre
tu peux sans doute tenter les cours de français aussi
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
Marsh Posté le 19-12-2005 à 13:57:35
ReplyMarsh 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à
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
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 =.
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
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
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