发生内存泄漏。 代码有什么问题?
static sigjmp_buf jmpbuf=NULL; static void alarm_func() { siglongjmp(jmpbuf, 1); } static struct hostent *timeGethostbyname(const char *domain, int timeout) { struct hostent *ipHostent = NULL; jmpbuf=malloc(sizeof(sigjmp_buf)); signal(SIGALRM, alarm_func); if(sigsetjmp(jmpbuf, 1) != 0) { alarm(0); signal(SIGALRM, SIG_IGN); return NULL; } alarm(timeout);//setting alarm ipHostent = gethostbyname(domain); signal(SIGALRM, SIG_IGN); return ipHostent; }
函数timeGethostbyname
出现错误。 如果我多次调用函数timeGethostbyname
将会发生timeGethostbyname
泄漏。 EX:
int main(int argc, char **argv ){ char *servers="www.aaa.bbb.tt"; struct hostent *h; while(1){ h=timeGethostbyname(servers, 2); } return(0); }
你不释放内存,由malloc动态分配jmpbuf=malloc(sizeof(sigjmp_buf));
在return ipHostent;
之前添加free(jmpbuf)
return ipHostent;
从函数*timeGethostbyname
。
注意你的代码运行一个循环来调用一个内存分配的函数,并且你在不用free()
情况下不断的分配内存。
在C中记住,当对象超出范围时,我们没有自动管理内存(自由)的垃圾回收器。在C中,您必须显式释放内存。 使用free()
函数。 所以,即使你把jmpbuf
local变成了函数timeGethostbyname()
你也需要在返回之前释放/释放内存,否则它将一直分配给你的进程(因为你在新函数调用 – 内存泄漏中丢失了内存的地址)。
除了内存泄漏之外,您必须在代码中获取错误/警告,因为您将jmpbuf
声明为static sigjmp_buf
值变量,而不是指针。 要么声明它为static sigjmp_buf*
类型,或者你甚至不需要为它分配内存。
您需要先static sigjmp_buf jmpbuf=NULL;
以static sigjmp_buf *jmpbuf=NULL;
然后,一旦完成分配的malloc
就可以free
由malloc
分配的任何内容。
在这种情况下,我不认为你需要malloc
sigjmp_buf
如果你做sigjmp_buf jmpbuf=NULL;
并使用在全局范围(数据区)中分配的内存而不是堆。
不需要为jmpbuf分配内存,因为它已经被下面的声明和定义分配了:
static sigjmp_buf jmpbuf=NULL;
那是因为你没有释放malloc分配的内存。 malloc的所有分配在使用后应该被释放,否则你会得到内存泄漏。