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

  FORUM HardWare.fr
  Programmation
  C++

  destructeur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

destructeur

n°921956
kris1406
Posté le 13-12-2004 à 15:53:13  profilanswer
 

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.

mood
Publicité
Posté le 13-12-2004 à 15:53:13  profilanswer
 

n°921968
HelloWorld
Salut tout le monde!
Posté le 13-12-2004 à 16:11:06  profilanswer
 

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


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°921980
kris1406
Posté le 13-12-2004 à 16:23:10  profilanswer
 

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.

n°921982
HelloWorld
Salut tout le monde!
Posté le 13-12-2004 à 16:24:41  profilanswer
 

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
n°921988
spokup
Posté le 13-12-2004 à 16:27:26  profilanswer
 

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];

n°922024
kris1406
Posté le 13-12-2004 à 16:49:27  profilanswer
 

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

n°922026
spokup
Posté le 13-12-2004 à 16:51:11  profilanswer
 

char *nom=""
 
vire ça aussi

n°922045
Lam's
Profil: bas.
Posté le 13-12-2004 à 17:08:28  profilanswer
 

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 ?
 

n°922050
kris1406
Posté le 13-12-2004 à 17:10:41  profilanswer
 

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

n°922063
bjone
Insert booze to continue
Posté le 13-12-2004 à 17:23:06  profilanswer
 

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
mood
Publicité
Posté le 13-12-2004 à 17:23:06  profilanswer
 

n°922121
kris1406
Posté le 13-12-2004 à 17:54:15  profilanswer
 

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

n°922154
yulara
Byte Hunter
Posté le 13-12-2004 à 18:26:17  profilanswer
 

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
n°922157
Taz
bisounours-codeur
Posté le 13-12-2004 à 18:29:44  profilanswer
 

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

n°922158
Lam's
Profil: bas.
Posté le 13-12-2004 à 18:30:13  profilanswer
 

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.

n°922159
Taz
bisounours-codeur
Posté le 13-12-2004 à 18:30:21  profilanswer
 

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"

n°922161
yulara
Byte Hunter
Posté le 13-12-2004 à 18:32:16  profilanswer
 

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
n°922177
bjone
Insert booze to continue
Posté le 13-12-2004 à 18:48:42  profilanswer
 

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

n°922182
Taz
bisounours-codeur
Posté le 13-12-2004 à 18:54:31  profilanswer
 

ben mets-y toi

n°922184
yulara
Byte Hunter
Posté le 13-12-2004 à 18:54:55  profilanswer
 

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
n°922185
bjone
Insert booze to continue
Posté le 13-12-2004 à 18:56:10  profilanswer
 

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

n°922186
Taz
bisounours-codeur
Posté le 13-12-2004 à 18:56:28  profilanswer
 

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

n°922187
bjone
Insert booze to continue
Posté le 13-12-2004 à 18:56:54  profilanswer
 

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

n°922190
yulara
Byte Hunter
Posté le 13-12-2004 à 19:01:04  profilanswer
 

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
n°922191
yulara
Byte Hunter
Posté le 13-12-2004 à 19:01:54  profilanswer
 

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
n°922192
Taz
bisounours-codeur
Posté le 13-12-2004 à 19:04:17  profilanswer
 

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

n°922202
yulara
Byte Hunter
Posté le 13-12-2004 à 19:14:10  profilanswer
 

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


---------------
Quizz'n'Blind pour tester vos connaissances
n°922544
HelloWorld
Salut tout le monde!
Posté le 14-12-2004 à 10:23:05  profilanswer
 

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
n°922560
yulara
Byte Hunter
Posté le 14-12-2004 à 10:48:31  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


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

  destructeur

 

Sujets relatifs
[C++] Premier constructeur & dernier destructeur spécifiques....debutant:en cpp il faut aussi un destructeur dans les structs ?
destructeur de list ????le destructeur est il executé a chaque boucle ?
Héritage et destructeur[c++] constructeur / destructeur
Destructeur de liste générique en C++Destructeur très urgent ! (pour dans qq heures)
[C++] une histoire de destructeur ... 
Plus de sujets relatifs à : destructeur


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