3 votes

Je ne comprends pas : libérer immédiatement après malloc ; fermer le fichier immédiatement après l'avoir ouvert.

Je suis en train de lire le code source d'un vieil outil de gestion de guichet de banque écrit en c en utilisant curses, voici quelques codes que je n'arrive pas à comprendre :

main(int argc, char *argv[])
{
    int h1, h2;
    char *m1, *m2;
    char fname[100];

    sprintf(fname, "%s/welcome.txt", getenv("xxDIR"));

    m1 = malloc(1);
    free(m1);

    h1 = open(fname, 0);
    if (h1>0) 
        close(h1);
    else 
        fprintf(stderr,"Open first  file : %s \n", strerror(errno));

    func1(argc, argv);

    h2 = open(fname, 0);
    if (h2>0) 
        close(h1);
    else 
        fprintf(stderr,"Open second file : %s \n", strerror(errno));

    if (h1!=h2) 
    {
        fprintf(stderr,"File Open/Close Check: h1=%d, h2=%d\n", h1, h2);
    }

    m2 = malloc(1);
    free(m2);

    if (m1!=m2) 
    {
        printf("Mem  Alloc/Free Check: %ld\n", (long)(m2-m1));
    }       

    exit(0);
}

Comme je l'ai demandé, pourquoi libérer immédiatement après malloc et fermer le fichier immédiatement après l'avoir ouvert ? Et func1 est ici :

func1(int argc, char *argv[])
{
    char trad_code[5];
    int xx1();
    int xx2();
    int xx3();
    int xx4();
    int xx5();
    int prt_translate(char *fmt, char *data);

    signal( SIGINT, SIG_IGN );

    scr_open();
    clear();
    refresh();

    while ( scr_kbhit() ) scr_getch();

    screen_set_function ( screen_FUNCID_CONFIRM, xx1 );
    screen_set_function ( screen_FUNCID_SETDATA, xx2 );
    screen_set_function ( screen_FUNCID_GETDATA, xx3 );
    screen_set_function ( screen_FUNCID_FLDIN,   xx4 );
    screen_set_function ( screen_FUNCID_FLDOUT,  xx5 );
    prt_set_transfunction ( prt_translate );

    if (sysinit()!=0)   
        goto sysexit;

    Show_Title();
    refresh();

    if (Show_Welcome())
        goto sysexit;

    strcpy(trad_code, "0000");
    do_menu( "0000", trad_code, xxx );

    syskill();

sysexit:

    clear();
    refresh();
    while ( scr_kbhit() ) scr_getch();
    endwin();

    return 0;
}

4voto

CherryDT Points 4046

Comme indiqué dans mon commentaire, il me semble que c'est une vérification pour voir si func1 fait fuir de la mémoire ou des handles de fichiers.

Essentiellement, le code vérifie si l'allocation de mémoire avant et après l'appel donnera la même adresse mémoire, ainsi que l'ouverture d'un fichier avant et après l'appel donnera le même gestionnaire de fichier.

Si func1 appelle malloc mais oublie de free la mémoire à nouveau, ou qu'il ouvre un fichier et ne le referme pas, les valeurs de m1 y m2 o h1 y h2 respectivement, seront différentes.

Toutefois, il ne s'agit pas d'une approche portable. Elle peut fonctionner sur une plate-forme spécifique, mais il n'y a aucune garantie que le tas et les gestionnaires de fichiers seront réutilisés de la même manière sur d'autres plates-formes - ils peuvent renvoyer des valeurs différentes avant et après l'exécution de la fonction func1 même si rien n'a été divulgué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X