无法理解这些:malloc后立即免费;打开后立即关闭文件

时间:2016-05-04 15:34:11

标签: c memory curses

我正在阅读一些关于c使用curses编写的银行出纳员旧管理工具的源代码,这里有一些我无法理解的代码:

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);
}

就像我问为什么它在malloc之后立即释放并在打开后立即关闭文件? func1在这里:

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;
}

1 个答案:

答案 0 :(得分:4)

正如我的评论中所述,在我看来,这是检查func1是否泄漏内存或文件句柄。

本质上,代码检查在调用之前和之后分配内存是否会返回相同的内存地址,以及在调用之前和之后打开文件将返回相同的文件句柄。

如果func1拨打malloc但又忘记了free内存,或者它打开了一个文件并且没有再次关闭,m1的值并且m2h1h2会有所不同。

然而,这不是一种便携式方法。它可能适用于一个特定的平台,但不能保证堆和文件句柄将像其他平台上那样重用 - 它们可能在func1之前和之后返回不同的值,即使没有泄露任何内容。