(Courriels de diversion: <prevaudrions@recommandables-suspectees.com> <internationalisees@gît-electorale.com> <jardine@decachetais-mediantes.com> <couvre-chefs@preencollee-moka.com> <reinsererait@reorienterait-horrifiions.com> <allergiques@dejaunissaient-blâmerait.com> <emporterait@bloquiez-rameras.com> <croquez@minerais-resoudrais.com> <chiffonnons@attentant-pied-de-poule.com> <combattront@coalescence-mesuser.com> )


marc Thirion wrote:
> 
> Le 5 Jan, Philippe CASIDY écrit :
> > On  5 Jan, benech wrote:
> 
> >> je developpe sous Motif 1.2 et une des fonctions classiques ne
> >> fonctionne pas. En effet, je souhaite liberer l espace memoire occupe
> >> par une XmStringTable.
> >>
> >> Dans le manuel de reference, il est indique de pratiquer de la
> >> maniere suivante
> >> :
> >> void FreeXmStringTable(argv)
> >> XmStringTable argv;
> >> {
> >>         register int i;
> >>         if(!argv)
> >>      return;
> >>         for(i=0; argv[i];i++)
> >>      XmStringFree(argv[i]);
> >>         XtFree(argv);
> >> }
> >>
> >> Or la fonction XtFree n accepte pas une XmStringTable en argument!!!
> >>
> >
> > A tout hasard, il n'y aurait pas une fonction XmFree() ?
> 
>   Non. Tout n'est pas redéfini. Dans l'optique Motif, soit tu as un type
> opaque (et donc des *Free), soit la structure est exposée et tu n'as pas
> forcément de Free spécifique.
> 
>   Donc, soit il existe XmStringTableFree, soit il faut faire un XtFree.
> 
>   Dans ce dernier cas, le problème rencontré par Nathalie est sans doute
> du au fait que XtFree déclare prendre un pointeur sur caractère en
> argument (pourquoi tant de haine ?), et pas un pointeur sur XmString.
> 
>   Il suffit vraisemblablement de forcer le type de l'argument à l'appel,
> du style : XtFree((char *)argv).
> 

Salut,

Je vais jouer au puriste (car je pense que Marc a donné la solution, à
une question pas trop précise ...).

En fait, l'idéal serait de savoir qui a alloué argv.
D'où vient la supposition que c'est XtMalloc ?
Personnellement, ça me choque un peu de libérer par
XtFree un pointeur dont je ne sais pas comment il a été
alloué.

Par ailleurs, je préférerais faire XtFree((XtPointer)argv)...
car j'aurais préféré que l'interface de XtFree soit
void XtFree(XtPointer ptr)
au lieu de
void XtFree(char *ptr)
comme on peut hélas le lire dans /usr/X11R6/include/X11/Intrinsic.h.
Question de cohérence...

C'est vrai que côté typage fort, pour ne pas dire programmation objet,
le langage C, même dans sa version ANSI, est un peu cavalier avec sa
notion de cast (qui permet de faire passer des vessies pour des
lanternes, aux risques et périls (calculés ?) du programmeur) !

Bon, pour se rassurer tout à fait, on peut aller voir les sources des
widgets concernés à condition d'utiliser Lesstif ou OpenMotif ...
et surement pas Motif 1.2 qui n'est pas du tout un logiciel libre
(à moins d'etre assez fortuné pour avoir acheté les sources de Motif :
serait-ce le cas du CNES ? ;-) ).

Pour ma part, je suis allé voir rapidement
lesstif-0.89.0/lib/Xm/List.c,
ce qui m'a (partiellement) rassuré, au moins pour les selected_items
gérés par ce widget List :

Allocation :

selected_items = (XmString *) XtMalloc(List_SelectedItemCount(w) *
                          sizeof(XmString));

Désallocation :

    for (i = 0; i < List_SelectedItemCount(w); i++)
    {
        XmStringFree(selected_items[i]);
    }

    XtFree((XtPointer)selected_items);
 

A+
-- 
Phil

---------------------------------------------------------------------
Aide sur la liste: <URL:mailto:linux-31-help@savage.iut-blagnac.fr>Le CULTe sur le web: <URL:http://www.CULTe.org/>