Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1201 connectés 

  FORUM HardWare.fr
  Programmation
  C

  API C de MySQL: fuite de mémoire

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

API C de MySQL: fuite de mémoire

n°498398
western
AJMM
Posté le 26-08-2003 à 12:29:05  profilanswer
 

Salut,
mon code est simple mais valgrind trouve des fuites de mémoires dans le library libmysqlclient.so.10.0.0. Est-ce que j'ai oublié quelque chose?
 
Mon code:

Code :
  1. char * requete = "SELECT * FROM "NOM_TABLE_1;
  2. MYSQL * mysql = mysql_init((MYSQL *)NULL);
  3. MYSQL_RES * mysql_resultat;
  4. MYSQL_ROW mysql_ligne;
  5. if(mysql == NULL)
  6. {
  7. return(-1);
  8. }
  9. if (!mysql_real_connect(mysql, ADRESSE_BDD, LOGIN_BDD, PASSWORD_BDD, NOM_BDD, 0, NULL, 0))
  10. {
  11. fprintf(stderr, "Impossible de se connecter au serveur %s\n Error=%s\n", ADRESSE_BDD, mysql_error(mysql));
  12. mysql_close(mysql);
  13. return(-1);
  14. }
  15. if(mysql_query(mysql, requete) != 0)
  16. {
  17. fprintf(stderr, "Impossible d'executer la requête %s\nError=%s\n", requete, mysql_error(mysql));
  18. }
  19. else
  20. {
  21. mysql_resultat = mysql_store_result(mysql);
  22. if(mysql_resultat != NULL)
  23. {
  24. for(i = 0; i < mysql_resultat->row_count; i++)
  25. {
  26. mysql_ligne = mysql_fetch_row(mysql_resultat);
  27. // le reste de traitement
  28. }
  29. }
  30. free(mysql_resultat);
  31. }
  32. mysql_close(mysql);


 
Sortie de Valgrind:

==2636== 40 bytes in 1 blocks are definitely lost in loss record 1 of 4
==2636== at 0x4015E310: malloc (vg_clientfuncs.c:103)
==2636== by 0x40254A2D: my_malloc (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
==2636== by 0x402500EF: read_rows (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
==2636== by 0x40251EF6: mysql_store_result (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
==2636==
==2636== 4088 bytes in 1 blocks are still reachable in loss record 2 of 4
==2636== at 0x4015E310: malloc (vg_clientfuncs.c:103)
==2636== by 0x4025A64C: my_once_alloc (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
==2636== by 0x4025ACB0: read_charset_index (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
==2636== by 0x4025AEAB: init_available_charsets (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
==2636==
==2636== 8164 bytes in 1 blocks are possibly lost in loss record 3 of 4
==2636== at 0x4015E310: malloc (vg_clientfuncs.c:103)
==2636== by 0x40254A2D: my_malloc (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
==2636== by 0x40257DF1: alloc_root (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
==2636== by 0x4024FF86: unpack_fields (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
==2636==
==2636== 8228 bytes in 2 blocks are still reachable in loss record 4 of 4
==2636== at 0x4015E310: malloc (vg_clientfuncs.c:103)
==2636== by 0x40254A2D: my_malloc (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
==2636== by 0x4025A218: init_dynamic_array (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
==2636== by 0x4025AE96: init_available_charsets (in /usr/lib/mysql/libmysqlclient.so.10.0.0)

mood
Publicité
Posté le 26-08-2003 à 12:29:05  profilanswer
 

n°498475
Taz
bisounours-codeur
Posté le 26-08-2003 à 13:58:22  profilanswer
 

aucune idée. lis bien la doc. t'es sur que dans ton for, y a rien à libérer ?
 
 
par contre tip-of-the-day
 
const char * const requete= "SELECT ..."; est bien mieux

n°498545
western
AJMM
Posté le 26-08-2003 à 14:42:42  profilanswer
 

Effectivement, j'ai oublié

Code :
  1. mysql_free_result(mysql_resultat);


Mais j'ai toujours

==3691== 64 bytes in 1 blocks are still reachable in loss record 1 of 2
==3691==    at 0x4015E310: malloc (vg_clientfuncs.c:103)
==3691==    by 0x40254A2D: my_malloc (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
==3691==    by 0x4025A218: init_dynamic_array (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
==3691==    by 0x4025AE96: init_available_charsets (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
==3691==  
==3691== 4088 bytes in 1 blocks are still reachable in loss record 2 of 2
==3691==    at 0x4015E310: malloc (vg_clientfuncs.c:103)
==3691==    by 0x4025A64C: my_once_alloc (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
==3691==    by 0x4025ACB0: read_charset_index (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
==3691==    by 0x4025AEAB: init_available_charsets (in /usr/lib/mysql/libmysqlclient.so.10.0.0)


n°498562
Taz
bisounours-codeur
Posté le 26-08-2003 à 15:03:53  profilanswer
 

et le verbiage de valgrind te dis rien?

n°498592
western
AJMM
Posté le 26-08-2003 à 15:26:51  profilanswer
 

verbiage?
j'utilise 3 paramètres de valgrind:


valgrind -v --leak-check=yes --show-reachable=yes ./TEST &> debug.log

n°498615
Taz
bisounours-codeur
Posté le 26-08-2003 à 15:41:13  profilanswer
 

ben oui  
 
==> at 0x4015E310: malloc (vg_clientfuncs.c:103)
 
c'est pas compliué, c'est un fichier à toi? ben ligne 103, t'as un malloc célibataire

n°498637
western
AJMM
Posté le 26-08-2003 à 15:57:49  profilanswer
 


je ne suis point aveugle!

Taz a écrit :


==> at 0x4015E310: malloc (vg_clientfuncs.c:103)
 
c'est pas compliqué, c'est un fichier à toi?  


non, regarde la pile d'appel:


at 0x4015E310: malloc (vg_clientfuncs.c:103)
by 0x40254A2D: my_malloc (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
by 0x4025A218: init_dynamic_array (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
by 0x4025AE96: init_available_charsets (in /usr/lib/mysql/libmysqlclient.so.10.0.0)


ou encore


at 0x4015E310: malloc (vg_clientfuncs.c:103)
by 0x4025A64C: my_once_alloc (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
by 0x4025ACB0: read_charset_index (in /usr/lib/mysql/libmysqlclient.so.10.0.0)
by 0x4025AEAB: init_available_charsets (in /usr/lib/mysql/libmysqlclient.so.10.0.0)


C'est-à-dire que l'allocation est demandée par la library libmysqlclient

Taz a écrit :


ben ligne 103, t'as un malloc célibataire


D'où ma question: est-ce que j'ai oublié d'appeler quelque chose? Ou faut-il que je me trouve une autre version de libmysql?

n°498668
Taz
bisounours-codeur
Posté le 26-08-2003 à 16:18:22  profilanswer
 

1) lis la doc
2) relis la doc
3) cherche un rapport de bugs
4) assure d'avoir la dernière version

n°503748
western
AJMM
Posté le 01-09-2003 à 08:52:06  profilanswer
 

Alors, personne n'utilise l'API C de MySQL?
Si?
Alors, personne ne vérifie les programmes qu'il écrit?! Et après on s'etonne que certaines choses marchent mal...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  API C de MySQL: fuite de mémoire

 

Sujets relatifs
DB2 : équivalent au rowcount d'Oracle ou Limit de MySQL ?Les champs "automatiques" dans une table MySQL
[SGBD/Mysql] Choix multiples et stockage en BDD[PHP/MySQL] Probleme de guillemets : A L'AIDE !!
Ecriture zone mémoire dans un fichier donne n'importe quoi (resolu)[MySQL] Comment incrémenter une valeur contenue dans un tableau ??
Topic sur les livres PHP / MYSQL + opinions[MySQL] A quoi sert l'attribut UNIQUE ??
[MySQL] Comparaison avec des type DateTime...[MySQL] Astuce pour qu'un count( ) vide retourne la valeur 0 ?
Plus de sujets relatifs à : API C de MySQL: fuite de mémoire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR