Bonjour,
J'aimerai avoir votre avis sur les différentes cause qui peuvent amener un programme a manger de la mémoire sur le systeme inutilement.(mon programme mange 300Mo de Mem vive en l'espace de quelques heures ...)

je n'ai fait aucun New dans ces lignes de codes donc aucun delete, dans la boucle de mon programme il n'y a aucune declaration de variable.

par contre dans ma boucle infini, il y a des appels de fonction dans lesquel, j'y declare des variables.

Ma question est donc, est il possible qu'a chaque fois qu'une de mes fonction est appelée la mémoire alloué par cette fonction ne soit pas libéré a la fin de celle si ? (ils s'agit de declaration du genre string test, etc...)

voici le code pour les curieux, il s'agit d'un prog qui va chercher ds une base une liste de reseaux, qui va les ping, et qui va ecrire le resultat ds la base, et tout sa en tournant en boucle.
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
#include <winsock.h>
#include <windows.h>
#include <iostream>
#include <string.h>
#include <sstream>
#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
 
using namespace std;
//Declaration des fonctions
string ping (string ip);
int net_send (string message);
string test_derniere_reponse (string ip);
 
//debut du programme
int main()
{
 
    unsigned int       nombres_champs    = 0;                
    std::string        affiche_site      = "";                 // le resultat de la requete SQL correspondant a la colonne site de la ligne selectionée
    std::string        affiche_ip        = "";                 // le resultat d ela requete SQL correspondant a la colonne IP de la ligne selectionée
    std::string        reponse_ping      = "";                 // la variable qui stockera le resultat de la fonction ping
    std::string        requete           = "";                 // la requete SQL pour la 1 ere session
    std::string        update_requete    = "";                 // la requete SQL pour la 2 eme session
    std::string        temp_requete      = "";                 // une variable temporaire pour bidouiller les requetes SQL
    std::string        message_net_send  = "";                 // notre variable pour faire passer un message a la fonction net send
    int                y                 = 0;                  // permettra d'avoir un identifiant de ligne lors d'une selection SQL Multiple    
 
//declaration des variables pour la bdd qui contient les infos reseaux
    /* const*/ std::string host          = "localhost";
    /* const*/ std::string  user         = "root";
    /* const*/ std::string  pass         = "manager";
    /* const*/ std::string  db           = "osiris";
 
    MYSQL      *                           sock ;                                        //Creation d'un string afin de permettre une saisie plus facile
    MYSQL_RES  *                           reponse;                                   //un pointeur sur la reponse SQL
    MYSQL_ROW                              ligne;                                      //pour lire le les resultats !
 
//declaration des variables pour la bdd qui contient les temps de réponse;
    /* const*/ std::string update_host  = "localhost";
    /* const*/ std::string  update_user = "root";
    /* const*/ std::string  update_pass = "manager";
    /* const*/ std::string  update_db   = "osiris";
 
    MYSQL      *                           update_sock ;    
 
//Initialisation de la connexion a la base qui stock les infos reseaux;                                                        
    sock = mysql_init(0);                                                     
    if (sock) cout << "Initialisation de la connexion Ok !" << "\n";                  
    else {
         cout << "ERREUR lors de l'initialisation de la connexion : " << mysql_error(sock) << "\n";
         }
//Initialisation de la connexion a la base pour mettre a jour les temps de réponse;
    update_sock = mysql_init(0);
    if (update_sock) cout << "Initialisation de la connexion Ok !" << "\n";
    else
         {
          cout << "Erreur lors de l'initialisation de la connexion : " << mysql_error(update_sock) << "\n";           
         }         
//connection pour recolter les infos reseau
    if (mysql_real_connect(sock, host.c_str(), user.c_str(), pass.c_str(), db.c_str(), 0, NULL, 0))   // Connection a la BDD avec pour parametres : sock = identificateur de la connexion, bufferhost = adresse IP de la machine, bufferuser = login de connexion a la base, bufferpass= pass de connection a la base, "" = nom de la base de donnée a selectionner (on peut par la suite faire un " USE ma_base; "
         cout << "connection ok, sur la bdd : " << db << "\n";
    else 
    {
         cout << "Echec de connection a la base de donnee : " << db << mysql_error(sock) << "\n";
    }
//connection pour mettre a jour les temps de reponses
    if (mysql_real_connect(update_sock, update_host.c_str(), update_user.c_str(), update_pass.c_str(), update_db.c_str(), 0, NULL, 0))   // Connection a la BDD avec pour parametres : sock = identificateur de la connexion, bufferhost = adresse IP de la machine, bufferuser = login de connexion a la base, bufferpass= pass de connection a la base, "" = nom de la base de donnée a selectionner (on peut par la suite faire un " USE ma_base; "
         cout << "connection ok, sur la bdd : " << db << "\n";
    else 
    {
         cout << "Echec de connection a la base de donnee : " << db << mysql_error(sock) << "\n";
    }
 
//execution d'une requete
/* cout << "requete ? " ;               
getline( cin, requete );      */                                
requete = "select site,ip from annuaire_reseau;";
 
cout << requete.c_str();
/* *****************************************************************
*                                                                  *
*                       Debut de la Boucle                         *                                      
*                                                                  *                                      
********************************************************************/
while (1)
{
if (mysql_query(sock,requete.c_str())) cout <<"echec de la requete, motif : \n" << mysql_error(sock) << "\n";
    else 
    {
    cout << "requete faite !\n" << endl;       
    reponse = mysql_use_result(sock);
    nombres_champs = mysql_num_fields(reponse);
    while ((ligne = mysql_fetch_row(reponse)))        //Tant qu'on a une ligne de selectionnée
            {
               y++;
               // selection de la ligne et affichage de ce que l'on va tester
                    affiche_site = ligne[0]; 
                    affiche_ip   = ligne[1];  
                    cout << "Connexion a : "<< affiche_site << " "<< "\"" << affiche_ip << "\"   ";
               //test reseau
                    reponse_ping = ping (affiche_ip);
                    cout << reponse_ping;
                    if (reponse_ping == "offline")  //si le reseau ne repond pas on va envoyer un message si derniere_reponse = 0 et modifier la base en conséquence
                        reponse_ping = ping (affiche_ip);
                    if (reponse_ping == "offline")
                    {
                                     if(test_derniere_reponse (affiche_ip)=="0")
                                     {
                                      message_net_send = "Le site de : " + affiche_site + " ayant pour passerelle : " + affiche_ip + " ne repond plus";                                    
                                      net_send(message_net_send);                                                          
                                      update_requete = "update annuaire_reseau set derniere_reponse = now() where ip = '" + affiche_ip + "';";
                                      mysql_query(update_sock,update_requete.c_str()); 
                                     }
                                     else
                                     {
                                         // on est deja au courant on ne touche pas a la date et on n'envoie pas de messages.
                                     }
 
                    }
                    else                 //si le reseau repond on verifie qu'avant il repondait bien sinon on averti user que le reseau est retabli, la base sera modifié en conséquence
                    {
                                      if(test_derniere_reponse (affiche_ip)=="0");
                                      else
                                      {
                                       message_net_send = "Le site de : " + affiche_site + " ayant pour passerelle : " + affiche_ip + " est a nouveau disponible";                                    
                                       net_send(message_net_send);
                                       update_requete = "update annuaire_reseau set derniere_reponse = '0' where ip='"+ affiche_ip +"';";
                                       if (mysql_query(update_sock,update_requete.c_str()))cout <<"echec de la requete, motif : \n" << mysql_error(sock) << "\n";   
                                      }                                       
                    }
 
               // update du temps de réponse
               update_requete = "update annuaire_reseau set PING = \"";
               temp_requete = "\" where ip= '" + affiche_ip;
               update_requete = update_requete + reponse_ping + temp_requete +"';";
               if (mysql_query(update_sock,update_requete.c_str()))cout <<"echec de la requete, motif : \n" << mysql_error(sock) << "\n";
               cout << endl;
            }  
    }  
}       
//Pause !
    system("PAUSE"); 
//Fermeture de la connection a la BDD
    mysql_close(sock);
    mysql_close(update_sock);
    return EXIT_SUCCESS;
}
/*
Fonction pour ping, qui va renvoyer le temps de reponse de l'@ IP renseignée
Pour ce faire on va faire un ping windows ou l'on va sauvegarder notre resultat 
dans un fichier tempY (avec y = identifiant de ping), ensuite on valire notre 
fichier et y trouver ou pas un temps de reponse et renvoyer ce dernier, si aucun 
temps de réponse n'est retrouvé on renvoie offline
*/
 string ping (string ip)
{
        int                      result      = 1;
        bool                     booltest    = false;
        char                     test[50];
        std::string              tests;
        std::string              ping_id;
        std::string              fichier = "temp";
        std::string              commande = "";
        std::ostringstream       oss;
        FILE *                   temp;
 
  commande = commande + "ping " + ip + " -n 1 -w 800 > temp" + ping_id;
  system(commande.c_str()); 
  temp = fopen (fichier.c_str(),"r");  
 while (!feof (temp))
       {
       fscanf (temp,"%s",test);
       if (booltest == true)
         {
                 booltest = false;
                 tests.assign(test);
                 fclose(temp);
                 return tests; 
         }
       if (strcmp (test,"bytes=32") == 0)
         {
                 booltest = true;
         }
 
       if (strcmp (test,"out.") == 0)
          {
                 result = 0;
          }
       }
 fclose(temp);
 tests.assign(test);
 tests = "offline";
 return tests;
}
/*
une fonction qui envoie un message a l'utilisateur, le message est passé en 
parametres sous la form d'un char
*/
int net_send (string message)
{
    string commande = "net send moisan.j ";
    commande = commande + message + " > save_net_send.txt";
    system(commande.c_str());
    return 1;
}
/*
Voici notre fonction qui va rechercher dans notre table annuaire_reseau la valeur 
de la colonne derniere_reponse et la retourner.
*/
string test_derniere_reponse (string ip)
{
    std::string         affiche         = "";
    std::string         requete         = "";
    unsigned int        nombres_champs  = 0;   
    char *              host            = "localhost";
    char *              user            = "root";
    char *              pass            = "manager";
    char *              db              = "osiris";
    MYSQL *             sock ;
    MYSQL_RES *         reponse;                                
    MYSQL_ROW           ligne;   
    //initialisation
    sock = mysql_init(0);                                                      // on initialise la connexion a la base de donnée
    if (sock);                  
    else {
         cout << "ERREUR lors de l'initialisation de la connexion : " << mysql_error(sock) << "\n";
         }
    //connection
    if (mysql_real_connect(sock, host, user, pass, db, 0, NULL, 0)); 
    else 
    {
         cout << "Echec de connection a la base de donnee : " << db << mysql_error(sock) << "\n";
    }
    //la requete
    requete = "select derniere_reponse from annuaire_reseau where ip='"+ip+"';";                      
    //execution de la requete
    if (mysql_query(sock,requete.c_str())) cout <<"echec de la requete, motif : \n" << mysql_error(sock) << "\n";
    else 
    {         
    reponse = mysql_use_result(sock);
    nombres_champs = mysql_num_fields(reponse);
    while ((ligne = mysql_fetch_row(reponse)))        //Tant qu'on a une ligne de selectionnée
            {
                    affiche = ligne[0];            // on stock le resultat de notre 1 ere case ds affiche  
            }  
    } 
 mysql_close(sock);
 if (affiche != "0"  )
 {
             return affiche;
 }
else
 { 
             return "0";
 }            
}