gpt4 book ai didi

看不懂这些 :free immediately after malloc;close file immediately after open

转载 作者:行者123 更新时间:2023-12-04 11:26:14 25 4
gpt4 key购买 nike

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

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 但忘记再次释放 内存,或者它打开了一个文件但没有再次关闭它, m1m2h1h2 的值分别不同。

但是,这不是一种可移植的方法。它可能在一个特定的平台上工作,但不能保证堆和文件句柄会像在其他平台上那样被重用——它们可能在 func1 之前和之后返回不同的值,即使没有泄漏.

关于看不懂这些 :free immediately after malloc;close file immediately after open,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37032219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com