问题出现在getfriendstr()函数当中,函数当中有这样一段:
for (i = 0; i < uinfo.fnum; i++)
{
uinfo.friend[i] = searchuser(tmp[i].id);
if (uinfo.friend[i] == 0)
deleteoverride(tmp[i].id, "friends");
/* 顺便删除已不存在帐号的好友 */
}
但是deleteoverride函数中间有:
if (delete_record(buf, sizeof(fh), deleted) != -1) {
(friendflag) ? getfriendstr() : getrejectstr();
} else {
形成了递归调用。
问题虽然不大,但是在getfriendstr()当中有calloc内存分配调用。
*alloc函数调用会从进程堆当中分配内存,不够空间时从系统堆当中取得,
free()之后进程如果不退出,不会把资源还给系统。如果一个用户好友名单
有100个,有10个已经不存在,那么在这里将占用53k堆空间。虽然不泄漏,
但也是浪费了。以下是gdb调试的堆栈情况
另外,由于friendflag的问题,删除reject的时候会刷新friend(莫名其妙)
Breakpoint 1, getfriendstr () at talk.c:2101
2101 {
(gdb) bt
#0 getfriendstr () at talk.c:2101
#1 0x809ab4d in getfriendstr () at talk.c:2116
#2 0x8099faf in deleteoverride (uident=0x80d25ba "ruickmouse",
filename=0x80b4700 "friends") at talk.c:1757
#3 0x809ab4d in getfriendstr () at talk.c:2116
#4 0x8099faf in deleteoverride (uident=0x80d212a "Auickmouse",
filename=0x80b4700 "friends") at talk.c:1757
#5 0x809ab4d in getfriendstr () at talk.c:2116
#6 0x8083948 in u_enter () at main.c:238
#7 0x8084f86 in user_login () at main.c:976
#8 0x80858d0 in start_client () at main.c:1244
#9 0x80690e5 in main (argc=1, argv=0xbffffa74) at bbsd.c:787
#10 0x4008ab65 in __libc_start_main (main=0x8068ad0 <main>, argc=1,
ubp_av=0xbffffa74, init=0x8052b18 <_init>, fini=0x80a492c <_fini>,
rtld_fini=0x4000df24 <_dl_fini>, stack_end=0xbffffa6c)
at ../sysdeps/generic/libc-start.c:111
--
FROM 211.69.197.73