use*_*581 2 c linux memory-leaks
内存泄漏发生了.代码有什么问题?
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;
}
Run Code Online (Sandbox Code Playgroud)
功能上有问题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);
}
Run Code Online (Sandbox Code Playgroud)
你不释放内存,动态分配由malloc的jmpbuf=malloc(sizeof(sigjmp_buf));
添加free(jmpbuf) 之前,return ipHostent; 从功能*timeGethostbyname.
注意你的代码运行一个循环来调用分配内存的函数,并且你不断地分配内存free().
记住在C中,我们没有垃圾收集器,当对象超出范围时自动管理内存(免费)---在C中你必须显式释放内存.使用free()功能.因此,即使你在jmpbuf本地函数变量timeGethostbyname()你需要在返回之前释放/释放内存,否则它将保持分配给你的进程(因为你在新函数调用中丢失了内存的地址--memory leak).
除了内存泄漏之外,您必须在代码中收到错误/警告,因为您声明的 jmpbuf 是值变量static sigjmp_buf但不是指针.要么将其声明为static sigjmp_buf*类型,要么甚至不需要为它分配内存.
| 归档时间: |
|
| 查看次数: |
340 次 |
| 最近记录: |