我正在阅读一些有关使用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;
}
如我的评论所述,在我看来,这是检查是否func1
泄漏内存或文件句柄。
从本质上讲,该代码检查在调用之前和之后分配内存是否会返回相同的内存地址,以及在调用之前和之后打开文件都会返回相同的文件句柄。
如果func1
调用malloc
但又忘记free
了内存,或者它打开了一个文件却又没有关闭它,则m1
andm2
或h1
and的值h2
将分别不同。
但是,这不是便携式方法。它可能在一个特定的平台上运行,但是不能保证堆和文件句柄将像在其他平台上那样被重用-func1
即使在没有任何泄漏的情况下,它们也可能在返回之前和之后返回不同的值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句