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 : 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;
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
*** glibc detected *** free(): invalid pointer: 0x081fb400 ***
et plus loin celle-ci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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;
    }
}
Le 2 en dur est normal, c'est un autre problème, il correspond au nombre de champs du résultat

Je l'appelle de la manière suivante dans le programme principal :

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);
Lors de l'exécution le printf vaut :

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 ***
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 ...