Iop à tous!
Voila le blème (généralement quand je poste ici, c'est que j'en ai un, snif):
J'ai une appli client/serveur en c/c++ sur windows. Un client ayant une fenêtre faite avec wxWidgets (mais le pb n'est pas là, du coup j'ai pas posté dans le forum dédié), et le serveur a une simple interface console. Le but est de permettre une gestion de fichiers, processus, etc. distantes sur le serveur. Jusque là, tout marchait impec' (plus ou moins proprement codé), mais maintenant, après avoir ajouté une fonctionnalité permettant d'envoyer un "statut", le serveur crashe, et pas forcément toujours au même endroit...
Par exemple, il me suffit d'uploader 3 fois un fichier pour que le serveur plante. Parfois, il me suffit simplement de demander de changer de répertoire 2 fois sur le serveur, et ça plante aussi.
Forcément, je me suis dit "t'as encore codé salement, et zappé des delete partout...", sauf que voila, quand j'ai voulu rajouter des delete où j'en avais oublié, ben y'en a qui font purement et simplement planter mon appli... Exemple:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 int x=0; //un entier if(bl) x=1; //si bl est a true, 1 int pwdX=0; //entier if(pwd) pwd=1; //si password est a true, 1 char* p1=new char(10); //quelques char* temporaires, avec un peu de marge char* p2=new char(10); char* p3=new char(10); char* p4=new char(10); char* p6; //pour avoir mon password dans un char * (a la base, password est un tableau de char[32] p6=new char(32); for(int i=0; i<32; i++) p6[i]=password[i]; //conversions de certaines donnees _itoa(port, p1, 10); _itoa(pwdX, p2,10); _itoa(x, p3, 10); _itoa(port2, p4, 10); //on fait une chaine, d'où les char* nécessaires pour string(char*) string infos=string(p1); infos=infos+" "+string(p2); infos=infos+" "+string(p6); infos=infos+" "+string(p4); infos=infos+" "+string(pathINIT); infos=infos+" "+string(p3); infos=infos+" "+heurDeb; //ce sont des string, ici infos=infos+" "+heurFin; infos=infos+" "+process; //permet de placer ma string dans un buffer pour envoyer parseStr(infos,2); //envoi envoyer(); //deletes que j'ai rajouté delete p1; delete p2; delete p3; delete p4; cout<<p6<<" "<<&p6<<endl; //me retourne bien un résultat cohérent! //delete [] p6; //ou delete p6; font planter l'appli!!! cout<<"oi!"<<endl; //ne s'affiche pas si le delete est présent return 0;
C'est un simple exemple qui devrait (je crois) fonctionner! Et qui plante des que je fais un delete sur p6... En gros j'obtiens un rapport d'erreur, avec, en grattant un peu, une "exception 0xc0000005".
Dans le second cas (plante au bout de 2 ou 3 uploads de fichiers), la ligne faisant planter le tout est:
Sachant que url vaut "test.txt", et que je suis bien positionné dans le bon répertoire (vu que ça plante 2 fois de suite, et que j'affiche le répertoire courant avant...).
Code : Sélectionner tout - Visualiser dans une fenêtre à part ofstream fichier(url, ios::out | ios::trunc);
Voila, j'imagine que c'est un problème de mémoire, vu que ça plante à différents endroits (qui n'ont a priori pas de liens...), mais je préfère être sur... Toujours est-il que c'est un vrai casse-tête!!! Je sais que je code pas toujours très proprement (mon 1er exemple le montre bien), mais je doute que ça vienne quand même de là!
Merci d'avance à ceux qui auront le courage de se pencher sur la question.
Bonne journée (soirée? matinée?)!
Partager