j´arrive en retard : j´étais pas la hier soir
TechSlash >
ce que tu fais ici :
mastring s = " plouf";
je sais pkoi ça plante sur le delete :
en 1 seule ligne, tu fais bcp de choses :
tout se passe comme si tu faisais :
mastring tmp("plouf");
mastring s=tmp;
reprenons la ligne totale :
mastring s = " plouf";
il voit " plouf", c´est un const char*, donc il va construire une instance de mastring, en utilisant le constructeur mastring(const char*) que tu as défini.
Apres, a ton avis, cette instance, c´est s ?
--> NON.
en effet, l´instance créée est le " tmp" si on décompose
ensuite, il voit que tu fais mastring s;
il appelle donc le constructeur mastring(void); que tu as défini.
Et ensuite, il va faire un =, donc comme TU N´AS PAS SURCHARGE L´OPERATEUR = ( et la est ton erreur)
il copie betement tmp dans s, champ à champ.
Ainsi
tmp.txt est un pointeur qui pointe sur la zone A273412F ( par exemple), et s.txt est également un pointeur qui pointe sur A273412F
" tmp" se détruit automatiquement, appelant son destructeur, et donc LIBERE A273412F.
et quand s est deleté, il essaie de libérer A273412F, or ça a déja été libéré
--> PLANTAGE.
voila, donc si tu veux qu´une classe soit robuste, il faut qu´elle aie :
constructeur par défaut ( que tu as mis)
constructeur par copie ( que tu as mis)
surcharge du = ( que tu as oublié)