Bonjour,
Je suis dans les phases finales de mon projet... mais bon sang j'aimerai pouvoir m'en sortir, parce que là, c'est assez.
Dans mon programme j'alloue fréquemment des zones pour des chaines de caractères. C'est parce que le SDK de géoconcept fonctionne comme ça. (parfois j'utilise des strings, mais je souhaite apprendre, donc manipuler les chaines de caractère ça me semble une bonne chose).
Passé les affres des différentes syntaxes pour l'initialisation (pas sûr d'avoir bien saisi quand même), je me suis dis qu'il serait bien d'avoir des fonctions de concaténation et de copie qui s'occupent toutes seules de la mémoire à allouer, respectivement strcat_d() et strcpy_d() (_d pour daniel...)
Les voici:
Je les teste avec le prog suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 char * strcat_d(char** but, const char* source) /**permet de concatener sans s'occuper de la memoire... j'espere*/ { if(source == NULL) return *but; if(but == NULL) return *but; if(*source == NULL) return *but; if(*but == NULL) return *but; UINT lenFinale = strlen(*but) + strlen(source) + 1; char * butSauf = *but; *but = NULL; *but = new char[lenFinale]; strcpy(*but, butSauf); delete butSauf; butSauf = NULL; strcat(*but, source); return *but; } char * strcpy_d(char** but, const char* source) /**permet de copier sans s'occuper de la memoire... j'espere*/ { if(source == NULL) return *but; if(but == NULL) return *but; if(*source == NULL) return *but; if(*but == NULL) return *but; UINT lenFinale = sizeof(source); char * butSauf = *but; delete butSauf; butSauf = NULL; *but = NULL; *but = new char[lenFinale]; strcpy(*but, source); return *but; }
Quand je commente 1 OU 2 ça marche impecc et sur 10000000 boucles, ya pas de fuite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 void main() { int i = 0; while(i<10000000) { char *mama = new char; mama[0] = 0; // strcpy_d(&mama, "hahahaihioyuiohoha"); // --1-- strcat_d(&mama, "patatipatata") // --2-- printf("%s", mama); delete mama; i++; } return; }
Quand je décommente les deux ça plante sur la 2ème fonction et ce quel que soit l'ordre. Le déboggueur me dit que c'est sur le "delete butSauf;" de la fonction qui vient en 2. (je pense qu'il faudrait un [] dans ce cas là)
Si je fais "char *mama = new char[];" puis "delete [] mama" (ce qui me semblerait logique) strcpy() plante mais pas strcat(). Le déboggueur me signale que c'est sur "delete [] mama;" que ça accroche dans ce cas là.
Je crois comprendre qu'il y a un problème avec mes "[]". Quelqu'un voit-il comment résoudre ce problème? J'ai envisagé de faire des tests sur la taille de *butSauf (l'objet pointé) pour savoir si je dois utiliser "delete [] ..." ou "delete tout court" mais ça ne me parait pas correct.
Je fais vraiment ça pour apprendre, je pense pouvoir utiliser des strings, mais je voudrai comprendre. Si vous pouvez m'aider, j'en serais heu-reux ^^.
Puis si ces deux fonctions pouvaient marcher impecc, mon prog en serait globalement heureux lui aussi!
Merci pour nous deux alors
Daniel
Partager