Problème de désallocation mémoire dans un bibliothèque
Bonjour,
Je ne suis pas très calé en C, mais j'ai besoin de quelques fonctions plus faciles à écrire en C qu'en Pascal. J'ai donc une petite librairie statique C avec quelques fonctions que je lie avec mon appli Pascal. Tout va bien, sauf la désallocation de la mémoire. Je m'explique:
Dans mon programme Pascal, j'appelle une fonction P qui appelle une fonction C1 écrite en C. Je récupère dans P un pointeur sur une structure pour laquelle C1 a alloué la mémoire nécessaire, je lis cette structure dans ma fonction P, et quand j'ai terminé, j'appelle une fonction C2 écrite en C qui libère la mémoire allouée dans C1. C'est là que ça bug. J'obtiens ce message au moment de la désallocation:
Code:
1 2
| *** error for object 0x1057a8c: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug |
Voici la fonction C1 écrite en C (Alloue la mémoire):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
size_t GetBSDProcessListSimple(procsimple ** proclistsimple)
{
int err, i, j;
kinfo_proc * process;
procsimple * result;
size_t processCount;
err = GetBSDProcessList(&process, &processCount);
result = (procsimple*)malloc(processCount * sizeof(procsimple));
for (i=0; i< processCount; i++) {
result[i].p_pid = process[i].kp_proc.p_pid;
for (j=0; j<128; j++) {
result[i].p_comm[j] = process[i].kp_proc.p_comm[j];
}
}
*proclistsimple = result;
free(process);
return processCount;
}; |
Voici la fonction C2 écrite en C (libère la mémoire):
Code:
1 2 3 4 5 6 7 8
|
int ReleaseProcessListSimple(procsimple ** proclistsimple)
{
procsimple * result;
result = *proclistsimple;
free(result);
return 0;
}; |
Voici la fonction P écrite en Pascal qui appelle les deux fonctions précédentes:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
// Remplit la StringList avec <ProcessName>,<ProcessId>
function GetProcess (var ProcessList:Tstringlist) : size_t; // OK
var
i: integer;
PProcList: p_procsimple;
begin
result := cfun.GetBSDProcessListSimple(@PProcList);
for i:=0 to result - 1 do begin
ProcessList.Add(PChar(PProcList^.p_comm) + ',' + IntToStr(PProcList^.p_pid));
PProcList := PProcList + (SizeOf(PProcList^) div result);
end;
cfun.ReleaseProcessListSimple(@PProcList);
end; |
Pour rappel, la librairie C n'est pas une DLL, elle est liée statiquement à programme Pascal lors de la compilation (Environnement Mac OS X)
Comme je maîtrise très mal C, je ne fais peut être pas le free sur le bon pointeur.
Merci,
André.