delete d'un char*** [C++] - C++ - Programmation
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 
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]
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  
 
 
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]
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...  
 
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. 
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]
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().
Marsh Posté le 06-05-2002 à 15:27:40
Arghhh!  (
( 
 
Ceci ne fonctionne pas, pq ??  
 
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 !  
 
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" ); 
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]
Marsh Posté le 06-05-2002 à 15:58:03

 
 
 
Pourquoi ça ne foncitonne pas cette fois-ci??   
  
 
 
 
 
Non, je déconne  .
. 
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 
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  
 
 
si tout marche, cool  
 
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]