[C++] delete d'un char***

delete d'un char*** [C++] - C++ - Programmation

Marsh Posté le 06-05-2002 à 02:55:29    

J'ai donc un char ***C en variable globale.
Je désire libérer la place mémoire qu'il occupe en le détruisant.
 
Pour ce faire, j'utilise les fonctions F1(void)
for (int i=0; i<nb_cat; i++)  { F2(C[i]); }
delete[] C;
 
et dans une fonction F2 (char**&C)  
for (int i=0; i<=lg; i++)  { delete[] C[i]; }
delete[] C;
 
Seulement voilà, le passage souligner pause problème... => Erreur pendant l'exécution :(
 
Comment faire?

 

[jfdsdjhfuetppo]--Message édité par Majca Jalasu le 06-05-2002 à 02:57:06--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 06-05-2002 à 02:55:29   

Reply

Marsh Posté le 06-05-2002 à 09:03:29    

ton char*** C c comme un tableau à 3 dimensions:
on va dire que la première est NbLigne
la deuxième est NbColonne
la troisième c un pointeur tout simplement
 
il fo faire:
 
for (int i = 0; i < NbLigne;  i++)
    delete[] tab[i]; // ETAPE 1: SUPPRIMER LES COLONNES
  delete[] tab;      // ETAPE 2: SUPPRIMER LES LIGNES
  //delete tab; ---A VERIFIER SI NECESSAIRE--- // ETAPE 3: SUPPRIMER LE POINTEUR

Reply

Marsh Posté le 06-05-2002 à 11:30:40    

J'essaie ça de suite, merci bcp.

Reply

Marsh Posté le 06-05-2002 à 11:56:26    

Décidément... Il y a tout de même un truc qui m'échappe... :(
 
char **T = new char*[3];
T[0] = "5";
T[1] = "couco";
T[2] = "prout";
for (int i=0; i<=2; i++)  { delete[] T[i]; }
delete[] T;
 
 
Où est l'erreur  :??:
 
edit: à nouveau, c'est la partie en gras qui semble poser problème...

 

[jfdsdjhfuetppo]--Message édité par Majca Jalasu le 06-05-2002 à 11:57:40--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 06-05-2002 à 12:53:11    

Majca Jalasu a écrit a écrit :

char **T = new char*[3];
T[0] = "5";
T[1] = "couco";
T[2] = "prout";
 
Où est l'erreur  :??:


tu essayes d'effacer de la mémoire qui a été statiquement allouée par le compilateur. (ton = ne fait qu'affecter un pointeur statique à un pointeur dynamique, qui du coup est écrasé).
 
strcpy(T[0], "5" ) -> correct.
 
edit : j'avais pas tout vu :D
 
char **T = new char*[3];
 
tu alloues trois POINTEURS. si tu veux mettre des trucs dedans, il faut allouer ici aussi !
 
// allocation
 
char **T = new char*[3];
for (i=0; i<3; i++)
{
  T[i] = new char [80];
  strcpy(T[i], "chaîne de caractères ..." );
}
 
// effacement
 
for (i=0; i<3; i++)
{
  delete [] T[i];
}
delete [] T;

 

[jfdsdjhfuetppo]--Message édité par youdontcare le 06-05-2002 à 12:56:06--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 06-05-2002 à 13:33:44    

C'est ce que j'avais avant ;)
 
J'ai écris ça de cette façon
char **T = new char*[3];
T[0] = "5";
T[1] = "couco";
T[2] = "prout";
for (int i=0; i<=2; i++)  { delete[] T[i]; }
delete[] T;
 
pour faciliter la lecture.
 
 
Quoiqu'il en soit, avec ceci:
 char **T = new char*[3];
 T[0] = new char[1];
 T[1] = new char[5];
 T[2] = new char[5];
 T[0] = "5";
 T[1] = "couco";
 T[2] = "prout";
 for (int i=0; i<=2; i++) {delete[] T[i];}
 delete[] T;  
 
Ca ne foncitonne pas non plus. => Erreur à l'exécution... :(

Reply

Marsh Posté le 06-05-2002 à 13:39:09    

Majca Jalasu a écrit a écrit :

C'est ce que j'avais avant ;)


non.
 
char **T = new char*[3];
for (i=0; i<3; i++)
{
 T[i] = new char [80];
  strcpy(T[i], "chaîne de caractères ..." );

}
 
lorsque tu fais T[i] = "machin", tu mets dans T[i] UNE ADRESSE STATIQUE ALLOUEE PAR LE COMPILATEUR. donc un free() sur cette adresse n'aura pas d'autre choix que de planter lamentablement.  
 
ce genre de trucs :
 
char* monMessage = "bonjour !";
 
n'a pas besoin d'être désalloué "à la main". c'est le compilateur qui l'alloue, c'est le compilateur qui le désalloue.

Reply

Marsh Posté le 06-05-2002 à 13:52:37    

youdontcare a écrit a écrit :

 
ce genre de trucs :
 
char* monMessage = "bonjour !";
 
n'a pas besoin d'être désalloué "à la main". c'est le compilateur qui l'alloue, c'est le compilateur qui le désalloue.  




 
 
Merci pour l'info, je ne le savais pas :).
 
Cepedant, dans le dernier cas que j'ai présenter, à savoir
Quoiqu'il en soit, avec ceci:
char **T = new char*[3];
T[0] = new char[1];
T[1] = new char[5];
T[2] = new char[5];
T[0] = "5";
T[1] = "couco";
T[2] = "prout";
for (int i=0; i<=2; i++) {delete[] T[i];}
delete[] T;
 
Pourquoi le "delete[] T[i]" déconne-t-il étant donné que j'ai allouer manuellement l'espace mémoire par les T[i] = new chat[x] ??
 
 
 
Edit:  oki, je pense avoir capté...
=> Si j'ai bien compris, pour T[1] par exemple, j'alloue un espace mémoire de 5 char, cet esapce mémoire étant pointé par T[1].
Seulement quand je fais un T[1] = "coucou", il ne met pas "coucou" dans l'espace mémoire précédement alloué mais dans un espace mémoire qu'alloue le compilateur.
Ce qui revient à dire que l'espace mémoire que j'avais précédement alloué est perdu.
C'est bien ça ?
 
 
Edit2:  donc, je dois mettre ceci ?
 char **T = new char*[3];
 T[0] = "5";
 T[1] = "couco";
 T[2] = "prout";
 delete[] T;

 

[jfdsdjhfuetppo]--Message édité par Majca Jalasu le 06-05-2002 à 13:56:59--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 06-05-2002 à 14:03:06    

Majca Jalasu a écrit a écrit :

Ce qui revient à dire que l'espace mémoire que j'avais précédement alloué est perdu.
C'est bien ça ?


oui ! :)  
 

Majca Jalasu a écrit a écrit :

Edit2:  donc, je dois mettre ceci ?
 char **T = new char*[3];
 T[0] = "5";
 T[1] = "couco";
 T[2] = "prout";
 delete[] T;


oui ! ou allouer chaque chaîne à la main et copier avec strcpy().

Reply

Marsh Posté le 06-05-2002 à 14:04:40    

Un GRAND merci, cher youdontcare :)

Reply

Marsh Posté le 06-05-2002 à 14:04:40   

Reply

Marsh Posté le 06-05-2002 à 15:27:40    

Arghhh! :((
 
Ceci ne fonctionne pas, pq ?? :cry:
Décidément... :(
 
char **C = new char*[2];
C[0] = new char[1];
strcpy (C[0], "1" );
C[1] = new char[5];
strcpy (C[1], "prout" );
 
for (int i=0; i<1; i++)  
{
delete[] C[i];
}
delete[] C;  
 
 
Apparement, j'ai rien compris ! :(

Reply

Marsh Posté le 06-05-2002 à 15:39:32    

une chaîne C est toujours terminée par un 0.
 
donc pour stocker "texte", il faut la longueur de texte (5) + 1 (pour le 0).
 
C[0] = new char[2];  
strcpy (C[0], "1" );

Reply

Marsh Posté le 06-05-2002 à 15:45:29    

ah ??
 
Je pensais que ça se faisais implicitement...
 
edit:  Ca fonctionne, un re GRAND merci ;)

 

[jfdsdjhfuetppo]--Message édité par Majca Jalasu le 06-05-2002 à 15:46:37--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 06-05-2002 à 15:58:03    

:(:(
 
Pourquoi ça ne foncitonne pas cette fois-ci??  :cry:  
 
 
 
 
Non, je déconne :lol:.
Je voulais juste inister sur mon merci vu que tous mes problèmes vennaient du fait que je pensais que le "+1" pour le caractère null était implicite.
Now, ça tourne impecablement.
 
Bref, j'aurais trainé encore quelques heures sans ton aide...
 
 
Merci,
Majca

Reply

Marsh Posté le 06-05-2002 à 16:19:10    

Majca Jalasu a écrit a écrit :

Je pensais que ça se faisais implicitement...


C et c++, c'est presque de l'assembleur moderne ... donc pour que ça fasse qq chose implicitement, tu peux toujours te brosser :D
 
si tout marche, cool :)

Reply

Sujets relatifs:

Leave a Replay

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