Bonjour,
Je rencontre quelques petits soucis, lorsque je veux appeler free() sur un pointeur, pointant le résultat d'une requête SQL via une structure. La structure est la suivante, elle correspond à une colonne de résultat SQL.
J'ai ma fonction exécutant ma requête SQL, qui me renvoie le nombre d'enregistrements affectés et pointeur de SqlQueryPtr (plusieurs colonnes retournées). Jusque la tout va bien, les résultats sont accessibles, c'est parfait.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 typedef struct { char ColName[ORA_COLNAME_MAX]; /* Name of the ORACLE column */ int ColLen; /* Max length of the values */ char *Values; /* Array of Values (see SQL_Query) */ } SqlQuery; typedef SqlQuery * SqlQueryPtr;
A la fin du programme, lorsque je veux libérer mon pointeur de SqlQueryPtr, et qu'il n'y a qu'un seul enregistrement retourné j'ai cette erreur :
et plus loin celle-ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 *** glibc detected *** free(): invalid pointer: 0x081fb400 ***
Le programme se termine normallement ... La fonction censait libérer la mémoire est la suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 *** glibc detected *** double free or corruption (!prev): 0x081fb3a0 ***
Le 2 en dur est normal, c'est un autre problème, il correspond au nombre de champs du résultat
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 SQL_FreeQuery (SqlQueryPtr query){ unsigned int i = 0; trace() if (query != NULL) { while( i < 2 ){ printf("-> %p (%s)\n",query[i].Values,query[i].Values); free(query[i].Values); i++; } trace() free(query); query = NULL; } }![]()
Je l'appelle de la manière suivante dans le programme principal :
Lors de l'exécution le printf vaut :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SqlQueryPtr SQP; /* Exécution de la requete */ SQL_Query("SELECT champ1, champ2 FROM matable",&SQP,0,BOOL_FALSE); /* Libération du résultat de la requête */ SQL_FreeQuery(SQP);
Le "double free" se produit lors du free(query).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 -> 0x81fb400 (pierre) *** glibc detected *** free(): invalid pointer: 0x081fb400 *** -> 0x81fb420 (8465) *** glibc detected *** double free or corruption (!prev): 0x081fb3a0 ***
Chose étrange, j'ai ce message d'erreur lorsque un seul tuple est retourné par la requête, avec 2 tuples ou plus je n'ai plus les messages d'erreurs. Pourquoi, n'ai-je le "invalid pointer" que quand i=0, quand i=1 il n'y a pas de message.
J'espère avoir été clair ...![]()
Partager