Alors quand j'appelle la fonction de puis le Pascal, je passe un pointeur:
result := cfun.GetBSDProcessListSimple(@PProcList);
Le @ en Pascal correspond au & en C. Si bien que PProclist pointe sur l'adresse de la structure créée dans la fonction C. Côté C, ça se passe ici:
*proclistsimple = result;
En fait au début je travaillais directement sur "*proclistsimple". Je suis passé par une variable supplémentaire "result" pour voir si ça ne résoudrait pas mes soucis, mais ça ne change rien.
D'ailleurs, cela fonctionne puisque je récupère bien ma liste de processus dans mon programme Pascal. Donc mon PProclist pointe sur la structure. Mais c'est quand je souhaite libérer la mémoire que ça coince, donc uniquement ici
cfun.ReleaseProcessListSimple(@PProcList);
ce qui appelle:
1 2 3 4 5 6 7 8
|
int ReleaseProcessListSimple(procsimple ** proclistsimple)
{
procsimple * result;
result = *proclistsimple;
free(result);
return 0;
}; |
Idem ici, mon premier code faisait directement un free sur "*proclistsimple". "result" est superflu.
Je finis par douter de la possibilité de faire ce type d'opération, à savoir:
1. Appel d'une fonction externe qui alloue et renvoie un pointeur
2. Utilisation du pointeur pour accéder à la structure
3. Appel d'une fonction externe qui désalloue la mémoire
En tous cas, je sais que je ne peux pas désallouer dans ma fonction Pascal ce que ma fonction C a alloué. C'est pourquoi je passe par une fonction C qui est censée le faire.
Partager