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:
Voici la fonction C1 écrite en C (Alloue la mémoire):
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 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
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; };
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é.
Partager