发生内存泄漏。代码有什么问题?
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
。将发生内存泄漏。
EX:
int main(int argc, char **argv ){
char *servers="www.aaa.bbb.tt";
struct hostent *h;
while(1){
h=timeGethostbyname(servers, 2);
}
return(0);
}
答案 0 :(得分:6)
您不释放内存,由malloc jmpbuf=malloc(sizeof(sigjmp_buf));
动态分配
在功能free(jmpbuf)
的{{1}}之前添加return ipHostent;
。
请注意,您的代码会运行一个循环来调用分配了内存的函数,并且您在不使用*timeGethostbyname
的情况下不断分配内存。
请记住,在C中,当对象超出范围时,我们没有自动管理内存(免费)的垃圾收集器---在C中,您必须显式释放内存。使用free()
函数。所以即使你在函数free()
本地变量jmpbuf
你需要在返回之前释放/释放内存,否则它将保持分配给你的进程(当你丢失新函数调用中的内存地址时 - -内存泄漏)。
除了内存泄漏之外,您必须在代码中收到错误/警告,因为您将timeGethostbyname()
声明为jmpbuf
的值变量而不是指针。要么将其声明为static sigjmp_buf
类型,要么甚至不需要为它分配内存。
答案 1 :(得分:1)
您需要先static sigjmp_buf jmpbuf=NULL;
到static sigjmp_buf *jmpbuf=NULL;
然后free
完成分配的内存后malloc
分配的任何内容。
在这种情况下,如果你执行malloc
,我认为你不需要sigjmp_buf
sigjmp_buf jmpbuf=NULL;
并使用在全局范围(数据区域)中分配的内存,而不是堆。 / p>
答案 2 :(得分:1)
没有必要为jmpbuf分配内存,因为它已经通过以下声明和定义分配:
static sigjmp_buf jmpbuf=NULL;
答案 3 :(得分:0)
那是因为你没有释放malloc分配的内存。应该在使用后释放malloc的所有分配,否则会出现内存泄漏。