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]