destructeur

destructeur - C++ - Programmation

Marsh Posté le 13-12-2004 à 15:53:13    

Salut,
Je débute en c++, et j'ai un petit problème avec le destructeur d'une classe.Voici le constructeur :  
 

Code :
  1. Point (int abs,int ord,char*nom1="" )
  2. {x=abs;
  3. y=ord;
  4. nom = new char [strlen(nom1 + 1)];
  5. strcpy(nom,nom1);
  6. }


int x, int y, char *nom sont des membres privés de ma classe.
Voici le destructeur :

Code :
  1. ~Point()
  2. {
  3. cout<<"Destructeur";
  4. delete []nom;
  5. }


Je suis sous visual C++. La compilation s'effectue sans problème. A l'exécution, le pgm plante lorsqu'il passe sur la ligne "delete []nom". Si qqun pouvait m'aider, merci.

Reply

Marsh Posté le 13-12-2004 à 15:53:13   

Reply

Marsh Posté le 13-12-2004 à 16:11:06    

Cherche même pas à comprendre, utilise std::string.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 13-12-2004 à 16:23:10    

Avec std::string, ça tourne, je l'avais déjà essayé. Mais, je ne comprends pas pq l'autre manière ne fonctionne pas. Merci qd même.

Reply

Marsh Posté le 13-12-2004 à 16:24:41    

C'est simple : les char *, c'est mal. Tu ne gagnes que ce genre de problèmes avec.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 13-12-2004 à 16:27:26    

essaye
 
if(nom)
  delete []nom;
 
et deja ya des truc louches :
 
 
nom = new char [strlen(nom1 + 1)];
 
c'est pas plutot ?
 
nom = new char [strlen(nom1)+1];

Reply

Marsh Posté le 13-12-2004 à 16:49:27    

Je n'avais pas vu l'erreur du strlen.  
Aves le test, ça ne fonctionne pas non plus.

Reply

Marsh Posté le 13-12-2004 à 16:51:11    

char *nom=""
 
vire ça aussi

Reply

Marsh Posté le 13-12-2004 à 17:08:28    

Bon, donne le code complet de ta classe, sinon on y arrivera pas. Est-ce qu'elle est dérivée ? Est-ce qu'il y a d'autres constructeur, ou as-tu redéfinis l'opérateur d'affectation ?
Comment te sers tu des objets ?
 

Reply

Marsh Posté le 13-12-2004 à 17:10:41    

Je suis passé sur dev-cpp, et là ça fonctionne.  
Merci pour l'aide

Reply

Marsh Posté le 13-12-2004 à 17:23:06    

si tu fais un vilain mix, tu le fais à peu près comme ça:
 

Code :
  1. 1. Point (int abs,int ord,char*nom_param=NULL)
  2.    2. {
  3.         x=abs;
  4.    3.   y=ord;
  5.        
  6.          if( nom_param )
  7.          {
  8.              nom = new char [strlen(nom_param)+1];
  9.     5.       strcpy(nom,nom_param);
  10.    6.    }
  11.          else
  12.             nom=NULL;
  13.        }


 

Code :
  1. 1. ~Point()
  2.    2. {
  3.    3. cout<<"Destructeur";
  4.          if( nom )
  5.     4.        delete []nom;
  6.    5. }


 
sinon tu vires ton "char* nom" de ta classe, et tu mets un std::string.
ça sera 10x plus propre.


Message édité par bjone le 13-12-2004 à 17:23:55
Reply

Marsh Posté le 13-12-2004 à 17:23:06   

Reply

Marsh Posté le 13-12-2004 à 17:54:15    

ok merci bjone. Pour le std::string, je l'avais déjà essayé, avec succès, mais au cours, on nous demande parfois d'utiliser le char *.

Reply

Marsh Posté le 13-12-2004 à 18:26:17    

j'en profites pour poser une question stupide (comme d'habitude...)
 
les std::string, c'est gourmand en place mémoire?  
 
(je demande parce que je ne les ai jamais utilisé, et si c'est pas gourmand, ça voudrait p'te le coup que je m'y mettes)


Message édité par yulara le 13-12-2004 à 18:26:36

---------------
Quizz'n'Blind pour tester vos connaissances
Reply

Marsh Posté le 13-12-2004 à 18:29:44    

kris1406 a écrit :

ok merci bjone. Pour le std::string, je l'avais déjà essayé, avec succès, mais au cours, on nous demande parfois d'utiliser le char *.

ouais, ben tu retournes en cours apprendre la forme de Coplien

Reply

Marsh Posté le 13-12-2004 à 18:30:13    

bjone a écrit :


Code :
  1. if( nom )
  2.     4.        delete []nom;




Pas besoin de faire ça, "delete 0;" et "delete [] 0;" sont valides tous les deux.  
 
Par contre, certains (mauvais) compilos ne l'aiment pas, certes.

Reply

Marsh Posté le 13-12-2004 à 18:30:21    

yulara a écrit :

j'en profites pour poser une question stupide (comme d'habitude...)
 
les std::string, c'est gourmand en place mémoire?  
 
(je demande parce que je ne les ai jamais utilisé, et si c'est pas gourmand, ça voudrait p'te le coup que je m'y mettes)

J'en profite pour faire une citation
 
"un programme qui plante est d'une utilité quasi-nulle"

Reply

Marsh Posté le 13-12-2004 à 18:32:16    

Taz a écrit :

J'en profite pour faire une citation
 
"un programme qui plante est d'une utilité quasi-nulle"


"un programme dépassant les 512Ko ne rentre pas dans la PROM" :spamafote:
 
d'ou ma question (oui je sais, j'ai qu'à bosser sur un PC :p )


Message édité par yulara le 13-12-2004 à 18:40:57

---------------
Quizz'n'Blind pour tester vos connaissances
Reply

Marsh Posté le 13-12-2004 à 18:48:42    

tu fait ton prototype avec un maximum d'objets déjà existants, après tu regardes comment optimiser tes ressources si tu es à cours...

Reply

Marsh Posté le 13-12-2004 à 18:54:31    

ben mets-y toi

Reply

Marsh Posté le 13-12-2004 à 18:54:55    

probleme: mon soft existe deja depuis un certain, je n'ai que 10ko de libre, donc avant de me taper les 450000 lignes à modifier, je me renseigne c'est tout :spamafote:


---------------
Quizz'n'Blind pour tester vos connaissances
Reply

Marsh Posté le 13-12-2004 à 18:56:10    

la question est:
 
tes chaines là, si tu est en rom, t'as besoin de les dupliquer ?

Reply

Marsh Posté le 13-12-2004 à 18:56:28    

ben techniquement une classe ça te permet aussi de centraliser le code de tes traitement de strings alors, ça peut réduire ton .text

Reply

Marsh Posté le 13-12-2004 à 18:56:54    

où tu peux avoir deux cas, un où l'on a une chaine en ROM et une autre en RAM ?

Reply

Marsh Posté le 13-12-2004 à 19:01:04    

alors je gére des chaines en RAM zero-power, en RAM, plus quelques constantes compressées (enfin je crois) en ROM.
 
elles font generalement moins de 32 caracteres, et les opérations sont ultra-basiques: strcpy, strncpy et strcmp.
 
ça répond à vos questions ou pas?


---------------
Quizz'n'Blind pour tester vos connaissances
Reply

Marsh Posté le 13-12-2004 à 19:01:54    

Taz a écrit :

ben techniquement une classe ça te permet aussi de centraliser le code de tes traitement de strings alors, ça peut réduire ton .text


je suis d'accord, mais si pour ça faut que j'embarque une lib de 10Ko, ça perd tres vite de son interet pour moi :spamafote:


---------------
Quizz'n'Blind pour tester vos connaissances
Reply

Marsh Posté le 13-12-2004 à 19:04:17    

ben ça pèse bien moins que ça. ça te permet de factoriser ton code et d'implémenter des mécanismes comme du COW

Reply

Marsh Posté le 13-12-2004 à 19:14:10    

oki, j'essaierai à l'occas voir si ça passe ou pas.


---------------
Quizz'n'Blind pour tester vos connaissances
Reply

Marsh Posté le 14-12-2004 à 10:23:05    

yulara a écrit :


les std::string, c'est gourmand en place mémoire?  


Ca dépend des implémentations. Certaines utilisent le Copy On Write, d'autres ne font de l'allocation dynnamique que pour une longueur > 15, et toutes stockent la longueur de la chaine ce qui permet d'économiser les appels à strlen.
http://c.developpez.com/faq/cpp/?p [...] GS_lenteur


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 14-12-2004 à 10:48:31    

merci pour le lien :jap:
 
mais bon, le probleme est resolu, mon ancetre de compilo n'accepte pas l'include de STRING, il me fait un caca nerveux sur streambuf (probablement parce qu'il y a 9 caractères...) :spamafote:


---------------
Quizz'n'Blind pour tester vos connaissances
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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