Salut à tous,

Alors voilà je démarre un peu le C++, et je me retrouve face à une erreur que je ne comprend pas.

J'ai une fonction qui est lancée dans un thread (pthread), que voilà :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
static void *client (void *p_data)
{
   struct cli *p_cli = reinterpret_cast<struct cli*>(p_data);
 
   if (p_cli != NULL)
   {
      // Traitements ...
 
      free (p_cli);
 
   }
}
Avec ces définitions :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;
 
struct cli
{
   pthread_t thread;
   SOCKADDR_IN sin;
   SOCKET sock;
   int err;
};
Lorsque le free(p_cli) est exécuté, j'ai droit à cette erreur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
*** glibc detected *** free(): invalid next size (fast): 0x0804b008 ***
Abandon
Je ne comprend pas trop d'où ça peut venir...

Le p_data en paramètre est défini comme ceci dans la fonction qui lance le thread :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
struct cli *p_cli = (struct cli *) malloc (sizeof (p_cli));
et passé ainsi en argument de pthread_create :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
pthread_create (&p_cli->thread, NULL, client, (void *)p_cli);
J'utilise les éléments de ma structure dans ma fonction client, et à priori ça fonctionne.

Je ne suis pas du tout familié de tout ce qui est gestion de la mémoire, j'utilise généralement des langages qui gèrent ça eux mêmes, et là je suis un peu perdu.
Je sais qu'étant donné qu'un thread est lancé, il me faut gérer la mémoire sinon il ne libère pas la mémoire qu'il occupe lorsqu'il s'arrête. Mais je ne comprend pas cette erreur...

Si quelqu'un pouvait m'éclairer ça serait cool

Merci par avance en tous cas !!

A+
Flo