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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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é.