Le 19/10/2012 16:18,
luc.mo...@igbmc.fr a écrit :
> Merci Fred !
>
> Je vais abuser de ta gentillesse pour ma culture et mon edification :
> tres =(double **)ckalloc((nseq+1)*sizeof(double *));
> for (i=0; i<nseq; i++) {
> tres[i] = (double *)ckalloc((nseq+1)*sizeof(double));
> }
> tres[nseq] = NULL;
>
> J'alloue un pointeur de pointeur. J'en alloue nseq+1
Plus exactement tu alloues un tableau de nseq pointeurs sur des tableaux
de nseq doubles. Une matrice nseq x nseq en gros.
Au passage le dernier élément de chaque tableau est inutile compte tenu
du code. Du coup tu peux réécrire comme suit :
tres =(double **)ckalloc(nseq*sizeof(double *));
for (i=0; i<nseq; i++) {
tres[i] = (double *)ckalloc(nseq*sizeof(double));
}
> Quand on desalloue,
> for (i=0; i<nseq; i++) {
> ckfree((char *)tres[i]);
> }
> ckfree((char *)tres);
>
> J'en desalloue nseq, et le dernier ckfree desalloue le nseq+1 ieme.
Ca désalloue tous les sous-tableaux du tableau principal puis le tableau
principal. Le code est correct est dans le bon ordre (toujours libérer
le contenu avant le contenant).
> Ou bien un seul ckfree() va desallouer tout le monde ?
Un seul ckfree ne désallouera que le tableau principal, donc tu auras
des fuites mémoire. Il faut toujours un appel à free par appel à alloc.
> Tant que j'y suis, ne faut-il pas desallouer le tableau de Tcl_Obj **Lseq ?
Non car il appartient à l'objet liste (objv[1]).
> Merci de m'éclairer !!
> Luc
>
De rien !
A++, Fred