* glibc detected * free(): invalid pointer
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.
Code:
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; |
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.
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 :
Code:
1 2
|
*** glibc detected *** free(): invalid pointer: 0x081fb400 *** |
et plus loin celle-ci :
Code:
1 2
|
*** glibc detected *** double free or corruption (!prev): 0x081fb3a0 *** |
Le programme se termine normallement ... La fonction censait libérer la mémoire est la suivante :
Code:
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;
}
} |
Le 2 en dur est normal, c'est un autre problème, il correspond au nombre de champs du résultat :mouarf:
Je l'appelle de la manière suivante dans le programme principal :
Code:
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); |
Lors de l'exécution le printf vaut :
Code:
1 2 3 4 5
|
-> 0x81fb400 (pierre)
*** glibc detected *** free(): invalid pointer: 0x081fb400 ***
-> 0x81fb420 (8465)
*** glibc detected *** double free or corruption (!prev): 0x081fb3a0 *** |
Le "double free" se produit lors du free(query).
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 ... :sleep: